[UVA816] Abbott's Revenge BFS

来源:互联网 发布:人工智能的现状论文 编辑:程序博客网 时间:2024/05/29 14:31

一个细节处理很麻烦的题, 首先是答案输出需要注意: 除了每个迷宫名字输出不要缩进外,每行都要缩进两格,而且路径输出时,每行最多输出10个节点.

再一个就是虽然答案可以递归地打印出来,但可能会因为最短路很长而出错.所以改用vector保存路径.

深夜做本题时,出了不少奇妙的bug,比如 bad alloc, 简直神了. 后来发现是因为假如一步就可以到达终点,那么压进vector的那个点是没有前驱的,查这个错查了很久.说明还是考虑不周密.

另外,就是本题中变量名超级多,所以要遵循一些命名规则,至少保证自己看得懂.代码如下:

#include<bits/stdc++.h>#define rep(i,a,n) for(i=a;i<=n;i++)#define per(i,a,n) for(i=a;i>=n;i--)#define maxn 10using namespace std;struct node{int dir,r,c;node(int dir=0, int r=0, int c=0): dir(dir),r(r), c(c) {}};const char* drt="NESW";const char* trn = "FLR";int hav_ege[maxn][maxn][5][4];//row,column,direction,turn, 0 symbolize no edge, 1 symbolize have edgeint vis[maxn][maxn][5];int dr[5]={-1,0,1,0};int dc[5]={0,1,0,-1};node ans[maxn][maxn][5];int r0,c0,re,ce;//starting point, starting direction, end pointchar d0[100];void prt_ans(node u);int get_drt(char d);int get_trn(char t);bool read_maze();node wlk(const node& u, int t);bool isd(node u);void slove();int get_drt(char d){return strchr(drt,d)-drt;}int get_trn(char t){return strchr(trn,t)-trn;}bool read_maze(){char s[100];if(scanf("%s%d%d%s%d%d",s,&r0,&c0,d0,&re,&ce)!=6) return false;printf("%s\n",s);memset(hav_ege,0,sizeof(hav_ege));int r,c;for(;;){scanf("%d",&r);if(r==0) break;scanf("%d",&c);while(scanf("%s",s)==1&&s[0]!='*'){int d=get_drt(s[0]);int len=strlen(s);int i;rep(i,1,len-1){int t=get_trn(s[i]);hav_ege[r][c][d][t]=1;}}}return true;}node wlk(const node& u, int t){int d=u.dir;if(t==1) d=(d+3)%4;if(t==2) d=(d+1)%4;return node(d,u.r+dr[d],u.c+dc[d]);}bool isd(node u){if(u.r<=9&&u.r>=1&&u.c>=1&&u.c<=9) return true;else return false;}void slove(){queue<node> q;memset(vis,-1,sizeof(vis));int d=get_drt(d0[0]);int r1=r0+dr[d];int c1=c0+dc[d];node v(d,r1,c1);vis[v.r][v.c][v.dir]=0;q.push(v);while(!q.empty()){node u=q.front();q.pop();if(u.r==re&&u.c==ce){prt_ans(u);return ;}int i;rep(i,0,2){node nxt=wlk(u,i);if(hav_ege[u.r][u.c][u.dir][i]&&isd(nxt)&&vis[nxt.r][nxt.c][nxt.dir]<0){q.push(nxt);vis[nxt.r][nxt.c][nxt.dir]=vis[u.r][u.c][u.dir]+1;ans[nxt.r][nxt.c][nxt.dir]=u;}}}printf("  No Solution Possible\n");}void prt_ans(node u){vector<node> asw;while(vis[u.r][u.c][u.dir]!=0){asw.push_back(u);u=ans[u.r][u.c][u.dir];}asw.push_back(u);asw.push_back(node(get_drt(d0[0]),r0,c0));int cnt=0;int len=asw.size()-1;int i;per(i,len,0){if(cnt%10==0) printf(" ");printf(" (%d,%d)",asw[i].r,asw[i].c);if(++cnt%10==0)printf("\n");}if((len+1)%10!=0) printf("\n");}int main(){while(read_maze()){slove();}return 0;}


0 0
原创粉丝点击