Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5000 Accepted Submission(s): 2311
A robot has been programmed to follow the instructions in its path. Instructions for the next direction the robot is to move are laid down in a grid. The possible instructions are
N north (up the page)
S south (down the page)
E east (to the right on the page)
W west (to the left on the page)
For example, suppose the robot starts on the north (top) side of Grid 1 and starts south (down). The path the robot follows is shown. The robot goes through 10 instructions in the grid before leaving the grid.
Compare what happens in Grid 2: the robot goes through 3 instructions only once, and then starts a loop through 8 instructions, and never exits.
You are to write a program that determines how long it takes a robot to get out of the grid or how the robot loops around.
3 6 5 NEESWE WWWESS SNWWWW 4 5 1 SESWE EESNW NWEEN EWSEN 0 0
10 step(s) to exit 3 step(s) before a loop of 8 step(s)
解题思路:其实,也算不上真正意义上的DFS题目,虽说函数名写得时BFS。直接按照题意写,一步一步走,碰到走过的或走出地图就直接结束,处理输出即可。
#include<cstdio> #include<cstring> int n,m,k; char map[12][12]; int flag[12][12]; int step1,loop; int sx,sy; void dfs(int x,int y) { switch(map[x][y]) //根据地图找方向 { case 'N':x--;break; case 'S':x++;break; case 'W':y--;break; case 'E':y++; } if(flag[x][y]) //当前节点已经走过了,有环 { loop=step1-flag[x][y]; step1=flag[x][y]; return ; } else if(x<0||x>=n||y<0||y>=m) //走出去了 return ; flag[x][y]=step1++; dfs(x,y); } int main() { while(scanf("%d%d",&n,&m)&&n||m) { step1=1; loop=0; memset(flag,0,sizeof(flag)); scanf("%d",&k); sx=0; sy=k-1; for(int i=0;i<n;i++) scanf("%s",map[i]); flag[sx][sy]=step1++; dfs(sx,sy); if(!loop) //没有环 printf("%d step(s) to exit\n",step1-1); else // 有环 printf("%d step(s) before a loop of %d step(s)\n",step1-1,loop); } return 0; }