题目链接
这道题目一眼看过去好像很难。第一眼看过去感觉估计就是要DFS或是BFS了。可是看了下题目,题目确实是很水的。
给你规划一条路线按照这条路线走下去。如果能走出去出去则输出。不能出去的话必定是有回路。那么就输出这个到达这个回路的步数以及回路的步数。
思路也是蛮简单的。这里就不多说了,在代码里面的注释也都写的蛮清楚的了:
#include <iostream> using namespace std; char a[15][15];//地图 int visit[15][15];//记录访问 int main() { int row,colum,start,count,count2; while(cin>>row>>colum>>start&&(row||colum||start)) { count2=0; //用于计算回路长度 count=0;//用于记录走过路长 memset(visit,0,sizeof(visit)); //初始化数组 for(int i=1;i<=row;i++) for(int j=1;j<=colum;j++) cin>>a[i][j]; int t=1; visit[t][start]=1; //将第一个结点初始化为1 (已走过) while(1) { if(a[t][start]=='N') //四种走法 t--; else if(a[t][start]=='S') t++; else if(a[t][start]=='W') start--; else if(a[t][start]=='E') start++; if(visit[t][start]==1) //发现回路 { visit[t][start]=0; //这个回路的每个节点都是1应该让第一个结点变成0所以走回这个结点时可以中断循环 while(1) { if(a[t][start]=='N') t--; else if(a[t][start]=='S') t++; else if(a[t][start]=='W') start--; else if(a[t][start]=='E') start++; count2++; if(visit[t][start]==0) break; } break; } visit[t][start]=1;// 每次走完一个结点 count++; if(t<1||t>row||start<1||start>colum ) break; } if(count2) cout<<count-count2+1<<" step(s) before a loop of "<<count2<<" step(s)"<<endl; else cout<<count<<" step(s) to exit"<<endl; } return 0; }