http://acm.hdu.edu.cn/showproblem.php?pid=1035
这倒题讲的是机器人通过给定的方向标识,判断花多长时间退出或者话多久后进入循环。
当然这道题也是用的深搜,改变的只有坐标就好了,问题是而且vis数组不需要reset,因为要判断是否重新回到一个点——会不会发生循环。
难点:记录走了多少步,我是在vis数组中记录当前是第几步,一举两得。记住有可能一开始就进入循环,所以vis数组初始化为-1.
#include<stdio.h> #include<cstring> #include<cmath> #include<iostream> using namespace std; int n,m,vis[1001][1001],xx,yy,T,flag; char G[1001][1001]; void dfs(int x,int y,int k); int main(){ while(~scanf("%d%d",&n,&m)&&n!=0&&m!=0){ scanf("%d",&T); for(int i=0;i<n;i++){ scanf("%s",G[i]); } memset(vis,-1,sizeof(vis)); vis[0][T-1]=0; flag=0; dfs(0,T-1,0); } return 0; } void dfs(int x,int y,int k){ if(flag==1)return; if(G[x][y]=='N'){ xx=x-1; yy=y; }else if(G[x][y]=='S'){ xx=x+1; yy=y; }else if(G[x][y]=='W'){ yy=y-1; xx=x; }else if(G[x][y]=='E'){ yy=y+1; xx=x; } if(xx<0||xx>=n||yy<0||yy>=m){ flag=1; printf("%d step(s) to exit ",k+1); return; } if(vis[xx][yy]!=-1){ flag=1; printf("%d step(s) before a loop of %d step(s) ",vis[xx][yy],k-vis[xx][yy]+1); return; } vis[xx][yy]=k+1; dfs(xx,yy,k+1); }