uva 816 Abbott's Revenge
2016-05-26 09:22
453 查看
#include<iostream> #include<cstdio> #include<vector> #include<cstring> #include<queue> using namespace std; struct Node{ int r,c,dir; Node(int r=0,int c=0,int dir=0): r(r),c(c),dir(dir) {}; }; const int maxn=100; const char *dirs="NESW"; const char *turns="FLR"; int have_edge[maxn][maxn][4][3]; int d[maxn][maxn][4]; Node p[maxn][maxn][4]; int r0,c0,dir,r1,c1,r2,c2; char s[100],s2[100]; int dir_id(char c) {return (int)(strchr(dirs,c)-dirs);} int turn_id(char c) {return (int)(strchr(turns,c)-turns);} int dr[4]={-1,0,1,0}; int dc[4]={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); } bool inside(int r,int c) { return r>=1&&r<=9&&c>=1&&c<=9; } bool read_case() { scanf("%s",s); if(s[0]=='E'&&s[1]=='N'&&s[2]=='D') return false; scanf("%d%d%s%d%d",&r0,&c0,s2,&r2,&c2); printf("%s\n",s); r1=r0+dr[dir_id(s2[0])]; c1=c0+dc[dir_id(s2[0])]; dir=dir_id(s2[0]); memset(have_edge,0,sizeof(have_edge)); for(;;) { int r,c; scanf("%d",&r); if(r==0) break; scanf("%d",&c); while(scanf("%s",s)==1&&s[0]!='*') for(int i=1;i<(int)strlen(s);i++) have_edge[r][c][dir_id(s[0])][turn_id(s[i])]=1; } return true; } 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(r0,c0,dir)); int cnt=0; for(int i=(int)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(cnt%10!=0) printf("\n"); } void solve() { queue<Node> q; Node u(r1,c1,dir); memset(d,-1,sizeof(d)); d[u.r][u.c][u.dir]=0; q.push(u); while(!q.empty()) { Node 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(have_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() { while(read_case()){ solve(); } return 0; }
相关文章推荐
- 我的数组类
- 创建Material Design风格的Android应用--应用主题(转)
- linux-memory-buffer-vs-cache
- SqlServer查询表中某列相同值的最近记录
- 密码太多记不住?SSO帮你轻松访问VDI及外部资源
- iOS中UIActivityIndicatorView的用法及齿轮等待动画实例
- 警察与厨师2
- uitableview进入编辑模式方法
- 实习半年感悟
- 第十三周实践项目-阅读下面的程序,并写出运行结果(3)
- 第十二周【项目2-Time类中的运算符重载】
- 浅谈如何使用代码为MP3文件写入ID3Tags
- C语言课设销售管理系统设计
- 这些词真的不该出现在简历上!
- Java读取Properties文件中在配置
- xcode git pod找不到头文件
- 欢迎使用CSDN-markdown编辑器
- 《上古天真论》第十三讲文字版
- 【Halcon】Halcon颜色识别之classify_fuses_gmm_based_lut.hdev
- Android异步任务AsyncTask