题目:给一个地图,地图中的每一个点给出了要前进的方向,如果可以走出边境,输出步数,如果出现了环,就输出到达重合点的步数,和环走完环的步数。
思想:按照他的方向前进就行,必定都是规定好的,然后用一个二维数组保存一个点第一次到达的步数即可。
#include<stdio.h> #include<string.h> #include<queue> using namespace std; int Row,Col,Ent; char maze[15][15]; struct NODE{ int x; int y; int steps; }; int steps[15][15]; bool visit[15][15]; int main() { while(~scanf("%d%d%d",&Row,&Col,&Ent) && Row){ for(int i = 1;i <= Row; ++i){ scanf("%s",maze[i] + 1); } memset(visit,false,sizeof(visit)); memset(steps,0,sizeof(steps)); struct NODE cur,nxt; queue<NODE>q; while(!q.empty()) q.pop(); cur.x = 1; cur.y = Ent; cur.steps = 0; steps[cur.x][cur.y] = 0; visit[cur.x][cur.y] = true; q.push(cur); while(!q.empty()){ cur = q.front(); q.pop(); if(maze[cur.x][cur.y] == 'N'){ nxt.x = cur.x - 1; nxt.y = cur.y; nxt.steps = cur.steps + 1; if(!visit[nxt.x][nxt.y]){ if(nxt.x >= 1 && nxt.x <= Row && nxt.y >= 1 && nxt.y <= Col){ steps[nxt.x][nxt.y] = steps[cur.x][cur.y] + 1; visit[nxt.x][nxt.y] = true; q.push(nxt); } else { printf("%d step(s) to exit\n",steps[cur.x][cur.y] + 1); break; } } else { printf("%d step(s) before a loop of %d step(s)\n",steps[nxt.x][nxt.y],nxt.steps - steps[nxt.x][nxt.y]); break; } } else if(maze[cur.x][cur.y] == 'S'){ nxt.x = cur.x + 1; nxt.y = cur.y; nxt.steps = cur.steps + 1; if(!visit[nxt.x][nxt.y]){ if(nxt.x >= 1 && nxt.x <= Row && nxt.y >= 1 && nxt.y <= Col){ steps[nxt.x][nxt.y] = steps[cur.x][cur.y] + 1; visit[nxt.x][nxt.y] = true; q.push(nxt); } else { printf("%d step(s) to exit\n",steps[cur.x][cur.y] + 1); break; } } else { printf("%d step(s) before a loop of %d step(s)\n",steps[nxt.x][nxt.y],nxt.steps - steps[nxt.x][nxt.y]); break; } } else if(maze[cur.x][cur.y] == 'E'){ nxt.x = cur.x; nxt.y = cur.y + 1; nxt.steps = cur.steps + 1; if(!visit[nxt.x][nxt.y]){ if(nxt.x >= 1 && nxt.x <= Row && nxt.y >= 1 && nxt.y <= Col){ steps[nxt.x][nxt.y] = steps[cur.x][cur.y] + 1; visit[nxt.x][nxt.y] = true; q.push(nxt); } else { printf("%d step(s) to exit\n",steps[cur.x][cur.y] + 1); break; } } else { printf("%d step(s) before a loop of %d step(s)\n",steps[nxt.x][nxt.y],nxt.steps - steps[nxt.x][nxt.y]); break; } } else{ nxt.x = cur.x; nxt.y = cur.y - 1; nxt.steps = cur.steps + 1; if(!visit[nxt.x][nxt.y]){ if(nxt.x >= 1 && nxt.x <= Row && nxt.y >= 1 && nxt.y <= Col){ steps[nxt.x][nxt.y] = steps[cur.x][cur.y] + 1; visit[nxt.x][nxt.y] = true; q.push(nxt); } else { printf("%d step(s) to exit\n",steps[cur.x][cur.y] + 1); break; } } else { printf("%d step(s) before a loop of %d step(s)\n",steps[nxt.x][nxt.y],nxt.steps - steps[nxt.x][nxt.y]); break; } } } } return 0; }