题目链接:1035
简单dfs:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char p[15][15];
int a,b,c,n,m;
int vis[15][15],count[15][15];//vis数组用来标记此方格机器人是否走过.count数组用来记录机器人走到(x,y)时走了多少步
int flag;
int num;
int dfs(int x,int y)
{if(flag==1||flag==2)//找到解后,不需继续遍历,直接return.return 0;if(vis[x][y]==true)//如果已经拜访过那么表示机器人陷入了循环,令flag==1,结束遍历{flag=1;printf("%d step(s) before a loop of %d step(s)\n",count[x][y]-1,num-count[x][y]+1);//需要输出机器人走了多少步陷入循环,以及循环圈有多少步.return 0;}if(x<1||x>a||y<1||y>b)//满足条件表示机器人出了区域{flag=2;return 0;}num++;//num计算机器人走了多少步,方便flag==2后的输出count[x][y]=num;//count[x][y]存储机器人走到(x,y)位置时走了多少步,方便flag==1后的输出.vis[x][y]=true;if(p[x][y]=='N'){dfs(x-1,y);}else if(p[x][y]=='S'){ dfs(x+1,y);}else if(p[x][y]=='W'){dfs(x,y-1);}else if(p[x][y]=='E'){dfs(x,y+1);}}
int main()
{int i,j;while(scanf("%d%d%d",&a,&b,&c)!=EOF){if(a==0&&b==0&&c==0)break;getchar();memeset(vis,0,sizeof(vis));memset(count,0,sizeof(count));flag=0;num=0;for(i=1;i<=a;i++)for(j=1;j<=b;j++){scanf("%c",&p[i][j]);if(j==b)getchar();}dfs(1,c);//从第一行第c个位置开始遍历if(flag==2)printf("%d step(s) to exit\n",num);}
}