最近在入门搜索的算法,首先要攻下dfs(想到后面还有bfs…)
上网搜了一下DFS入门题有哪些,看到其中一道就是这道;
题目不算难,思路比较直接(但是还是WA了几次…)
题目如下:
注意点:dfs的下一次递归要在当前递归的所有操作完成后再进行,否则出现计算时loop的step为0!
AC代码(含注解):
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;//DFS用vis数组判断是否已经走过,若走过,则出现环;
char map[15][15];//构造地图;
int vis[15][15];//用来标记该处是否已经走过;
int step[15][15];//用来标记走到该处花了多少步;
int flag,l;//flag表示是成环还是成功走出,l记录成环时环中多少步;
int n,m,k;//n行m列,起始位置为第k列;
int f;//记录上一步是步数;
void dfs(int x,int y)
{
if(x>=1&&x<=n&&y>=1&&y<=m)//确认在范围内后四个方位按指令遍历;
{
if(map[x][y]=='S'&&vis[x][y]==0)
{
vis[x][y]=1;//标记已经走过;
f++;
step[x][y]=f;
dfs(x+1,y);//必须要在当前状态确认完成后再去执行下一状态操作;
}
else
if(map[x][y]=='N'&&vis[x][y]==0)
{
vis[x][y]=1;
f++;
step[x][y]=f;
dfs(x-1,y);
}
else
if(map[x][y]=='W'&&vis[x][y]==0)
{
vis[x][y]=1;
f++;
step[x][y]=f;
dfs(x,y-1);
}
else
if(map[x][y]=='E'&&vis[x][y]==0)
{
vis[x][y]=1;
f++;
step[x][y]=f;
dfs(x,y+1);
}
else
if(vis[x][y]==1)
{
flag=1;
f++;
l=f-step[x][y];
return ;
}
}
else
return ;
}
int main()
{
int i,j;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
getchar();//吃掉换行符不然第一个字符就变换行符了!
if(n==0&&m==0&&k==0)
break;
memset(vis,0,sizeof(vis));
memset(step,0,sizeof(step));
f=-1;//因为第一步进入图不算;
flag=0;//开始时假设能走出;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%c",&map[i][j]);
}
getchar();//吃换行符;
}
dfs(1,k);
if(!flag)
printf("%d step(s) to exit\n",f+1);//出图还有一步,要加一;
else
printf("%d step(s) before a loop of %d step(s)\n",f-l,l);
}
return 0;
}
坚持,努力!!!