bfs Abbott的复仇 UVA 816
来源:互联网 发布:乌克兰危机知乎 编辑:程序博客网 时间:2024/04/28 02:38
#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<string>#include<stack>#include<queue>#include<vector>#include<map>#include<set>#include<iostream>#define LL long long#define INF 0x3f3f3f3fusing namespace std;const int N=1000000009;struct Node{ int r,c,dir; Node(int r=0,int c=0,int dir=0):r(r),c(c),dir(dir){}};int d[11][11][5],has_edge[11][11][5][4],r1,c1,r2,c2,dir1;Node p[11][11][5];const char* dirs = "NESW";const char* turns = "FLR";int dir_id(char c) {return strchr(dirs,c)-dirs; }int turn_id(char c) {return strchr(turns,c)-turns; }const int dr[]={-1,0,1,0};const int dc[]={0,1,0,-1};Node walk(const Node& u,int turn ){ int dir = u.dir; if(turn==1) dir=(dir+3)%4; if(turn==2) dir=(dir+1)%4; return Node(u.r+dr[dir],u.c+dc[dir],dir);}void print_ans(Node u){ vector<Node>nodes; for(;;){ nodes.push_back(u); if(d[u.r][u.c][u.dir]==0) break; u=p[u.r][u.c][u.dir]; } nodes.push_back(Node(r1,c1,dir1)); int cnt=0; for(int i=nodes.size()-1;i>=0;i--){ if(cnt%10==0) printf(" "); printf(" (%d,%d)",nodes[i].r,nodes[i].c); if(++cnt%10==0) printf("\n"); } if(nodes.size()%10!=0) printf("\n");}/*void print_ans(Node u){ vector<Node> vec; while(1) { if(d[u.r][u.c][u.dir]==0) break; vec.push_back(u); u=p[u.r][u.c][u.dir]; } //u.r=r0;u.c=c0;u.dir=dir; vec.push_back(Node(r1,c1,dir1));// cout<<s1<<endl; int cnt=0; for(int i=vec.size()-1;i>=0;i--) { cnt++; if(cnt==1) printf(" "); printf("(%d,%d)",vec[i].r,vec[i].c); if(cnt!=10&&i!=0) printf(" "); if(cnt==10&&i!=0) {printf("\n");cnt=0;} } printf("\n");}*/bool inside(int x,int y){ if(x>=1&&x<=9&&y>=1&&y<=9) return true; return false;}void solve(){ int r3,c3;char cd;string ss; cin>>r1>>c1>>cd>>r2>>c2; while(cin>>r3&&r3!=0){ cin>>c3; while(cin>>ss&&ss!="*"){ for(int i=1;i<ss.size();i++) has_edge[r3][c3][dir_id(ss[0])][turn_id(ss[i])]=1; } } dir1=dir_id(cd); queue<Node>q; memset(d,-1,sizeof(d)); Node u(r1,c1,dir1); u=walk(u,0); d[u.r][u.c][u.dir]=0; q.push(u); while(!q.empty()){ u=q.front();q.pop(); if(u.r==r2&&u.c==c2) {print_ans(u);return ; } for(int i=0;i<3;i++){ Node v=walk(u,i); if(has_edge[u.r][u.c][u.dir][i]&&inside(v.r,v.c)&&d[v.r][v.c][v.dir]<0 ){ d[v.r][v.c][v.dir]=d[u.r][u.c][u.dir]+1; p[v.r][v.c][v.dir]=u; q.push(v); } } } printf(" No Solution Possible\n");}int main(){#ifdef TSQ freopen("f:\\1.txt","r",stdin);#endif // TSQ string st; while(cin>>st&&st!="END"){ cout<<st<<endl; solve(); } return 0;}#include<cstdio>#include<cstring>#include<string>#include<queue>#include<iostream>#include<algorithm>using namespace std;struct note{ int r; int c; int dir;};string s,s1;int r0,c0,r1,c1,dir,r2,c2;int has_edge[10][10][4][3];int d[10][10][4];note p[10][10][4];char dirs[]={'N','E','S','W'};char turns[]={'F','L','R'};int dr[]={-1,0,1,0};int dc[]={0,1,0,-1};note walk(note u,int turn){ note v; int dirr=u.dir; if(turn==1) {dirr=(dirr+3)%4;} if(turn==2) {dirr=(dirr+1)%4;} v.r=u.r+dr[dirr]; v.c=u.c+dc[dirr]; v.dir=dirr; return v;}bool inside(int x,int y){ if(x>=1&&x<=9&&y>=1&&y<=9) return true; return false;}void print_ans(note u){ vector<note> vec; while(1) { if(d[u.r][u.c][u.dir]==0) break; vec.push_back(u); u=p[u.r][u.c][u.dir]; } u.r=r0;u.c=c0;u.dir=dir; vec.push_back(u); cout<<s1<<endl; int cnt=0; for(int i=vec.size()-1;i>=0;i--) { cnt++; if(cnt==1) printf(" "); printf("(%d,%d)",vec[i].r,vec[i].c); if(cnt!=10&&i!=0) printf(" "); if(cnt==10&&i!=0) {printf("\n");cnt=0;} } printf("\n");}void solve(){ queue<note> q; note uu; uu.r=r0;uu.c=c0;uu.dir=dir; note u; u.r=r1;u.c=c1;u.dir=dir; d[r1][c1][dir]=1; p[r1][c1][dir]=uu; d[r0][c0][dir]=0; q.push(u); while(!q.empty()) { u=q.front(); q.pop(); if(u.r==r2&&u.c==c2) {print_ans(u);return;} for(int i=0;i<3;i++) { note v=walk(u,i); if(has_edge[u.r][u.c][u.dir][i]&&inside(v.r,v.c)&&d[v.r][v.c][v.dir]<0) { p[v.r][v.c][v.dir]=u; d[v.r][v.c][v.dir]=d[u.r][u.c][u.dir]+1; q.push(v); } } } cout<<s1<<endl; printf(" No Solution Possible\n");}int main(){ while(cin>>s1) { if(s1=="END") break; memset(has_edge,0,sizeof(has_edge)); memset(d,-1,sizeof(d)); memset(p,0,sizeof(p)); int a,count=0; int a1,a2,dir1,turn1; while(cin>>a) { if(a==0) break; count++; if(count==1) { r0=a; cin>>c0>>s>>r2>>c2; for(int i=0;i<4;i++) { if(s[0]==dirs[i]) { dir=i; break; } } r1=r0+dr[dir]; c1=c0+dc[dir]; } else { a1=a; cin>>a2; while(cin>>s) { if(s[0]=='*') break; for(int i=0;i<4;i++) { if(s[0]==dirs[i]) { dir1=i; break; } } for(int i=1;i<s.size();i++) { for(int j=0;j<3;j++) { if(s[i]==turns[j]) { turn1=j; break; } } has_edge[a1][a2][dir1][turn1]=1; } } } } solve(); } return 0;}
0 0
- bfs Abbott的复仇 UVA 816
- Abbott的复仇(Abbott's Revenge, ACM/ICPC World Finals 2000, UVa 816)<经典BFS>
- 例题:Abbott的复仇(UVa 816)
- [UVa 816] Abbott 的复仇(Abbott's Revenge)
- Abbott的复仇(Abbott's Revenge)BFS算法实现
- Abbott 的复仇(Abbott's Revenge,ACM|IPPC World Finals 2000, UVa 816)
- Abbott 的复仇(Abbott's Revenge,ACM|IPPC World Finals 2000, UVa 816)
- Uva816 Abbott的复仇
- UVa816 Abbott的复仇
- Abbott的复仇 Uva816
- 例题6-14 Abbott的复仇(Abbott's Revenge, ACM/ICPC World Finals 2000, UVa 816)
- Abbott的复仇(Abbott's Revenge)
- UVA 816 - Abbott's Revenge(BFS)
- uva 816 - Abbott's Revenge(bfs)
- UVA-816 Abbott's Revenge (bfs)
- Abbott的复仇(Abbott's Revenge)ACM/ICPC WF2000
- Abbott的复仇——最短路
- uva 816 - Abbott's Revenge(有一点难度的bfs迷宫题目)
- 浅谈win32恶意程序逻辑锁
- B+tree 实现
- 编程面试十大算法总汇
- (3615)POJ
- HUAWEI USG 静态地址转换--网内
- bfs Abbott的复仇 UVA 816
- web乱码处理
- Calendar 日期格式问题
- 视图
- 回溯算法 和 贪心算法(全排列)
- A closed form solution to natural image matting。《Computer Vision for Visual Effects》讲解笔记。
- UVA 11468(Substring-AC自动机上dp)[Template:AC自动机]
- 如何画出甘特图——2013版Excel
- PHP5.6和Apache2.4的安装和配置