题目链接: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);
}
}
本文介绍了一种使用深度优先搜索(DFS)解决迷宫问题的方法,通过C语言实现,详细展示了如何避免循环路径并计算机器人走出迷宫所需的步数。
473

被折叠的 条评论
为什么被折叠?



