这道dfs的题只需要根据具体的方向走就可以,不需要把所有的邻接点都访问一遍。
题意:机器人根据网格中的指示,走向不同的方向,如果可以走出去,输出步数;如果走不出去,输出遇到环之前走了几步,并输出环的大小
思路:设置一个数组,记录当前走的步数,如果超出范围,说明可以走出去,输出相应的步数;如果遇到被标记的,说明走不出去,先输出当前位置的步数,然后用前一个的步数,减去当前位置的步数,得到环的大小。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char robot[15][15];
int vis[15][15];
int r,c,st;
int loop,step;
int dfs(int x,int y,int num)
{
if(x>r||x<1||y<1||y>c)
{
cout<<num-1<<" step(s) to exit"<<endl;
return 0;
}
if(vis[x][y])
{
cout<<vis[x][y]-1<<" step(s) before a loop of ";
return 1;
}
vis[x][y]=num;
if(robot[x][y]=='N')
{
if(dfs(x-1,y,num+1)==1)
cout<<vis[x][y]-vis[x-1][y]+1<<" step(s)"<<endl;
}
else if(robot[x][y]=='S')
{
if(dfs(x+1,y,num+1)==1)
cout<<vis[x][y]-vis[x+1][y]+1<<" step(s)"<<endl;
}
else if(robot[x][y]=='E')
{
if(dfs(x,y+1,num+1)==1)
cout<<vis[x][y]-vis[x][y+1]+1<<" step(s)"<<endl;
}
else
{
if(dfs(x,y-1,num+1)==1)
cout<<vis[x][y]-vis[x][y-1]+1<<" step(s)"<<endl;
}
return 0;
}
int main()
{
//freopen("in.txt","r",stdin);
while(cin>>r>>c>>st,r&&c)
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
cin>>robot[i][j];
dfs(1,st,1);
}
return 0;
}