题意:看图就能明白。一种情况是走出迷宫,一中情况是死循环,分别输出走出去用的步数,还有多少步开始出现环,还有走一个环需要的步数。
思路:第一感觉就是DFS,但是自己写了个代码,各种案例都可以通过,依然WA,最后无奈只有参考了网上的代码。
http://hi.baidu.com/niren_cn/blog/item/cd76cca6d23733b6caefd0c0.html
#include<iostream>
#include<stdlib.h>
using namespace std;
struct point
{
char s;
int step;
bool vis;
}map[15][15];
int n,m,sx;
bool check(int i,int j)
{
if(i>=1&&i<=n&&j>=1&&j<=m)
return true;
else return false;
}
void dfs(int i,int j,int step)
{
//printf("%d %d %d\n",i,j,step);
//system("pause");
if(!check(i,j))
{printf("%d step(s) to exit\n",step);return;}//放在后面判断就会出错。囧啊 还是太菜了~
if(map[i][j].vis)
{
printf("%d step(s) before a loop of %d step(s)\n",map[i][j].step,step-map[i][j].step);
return;
}
if(check(i,j))
{
//printf("%d %d %d\n",i,j,step);
//system("pause");
if(!map[i][j].vis)
{
map[i][j].step=step;
map[i][j].vis=1;
if(map[i][j].s=='N')
dfs(i-1,j,step+1);
else if(map[i][j].s=='S')
dfs(i+1,j,step+1);
else if(map[i][j].s=='E')
dfs(i,j+1,step+1);
else if(map[i][j].s=='W')
dfs(i,j-1,step+1);
}
}
}
int main()
{
int i,j;
while(scanf("%d%d%d",&n,&m,&sx)!=EOF)
{
//system("pause");
if(n==0&&m==0&&sx==0) break;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
cin>>map[i][j].s;
map[i][j].step=0;
map[i][j].vis=0;
}
// printf("运行");
dfs(1,sx,0);
}
}