题目大意:就是给你一张图,然后你根据每次所在的位置的那个要求走下一步,出界条件就是结束的条件,否则如果进入循环你要输出你是经过几步到达这个循环的,并且这个循环有几步,胡搞题

注意:一开始你是在图内的,并不是从外面走向图内的,所以你一开始的位置要标记,并且保存的步数是0,dfs函数代表下一步的位置的情况,book保存的是你当前的步数(相对于本次表示的是上一次经过这个位置的步数),循环条件就是你遇到一个你已经走过的,并且上一次你用book步走到这个循环,这个循环有step-book步

AC代码如下:

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

char map[11][11];
int n,m,book[11][11],mark[11][11];

int pan(int x,int y)
{
	if(x<0||x>n-1||y<0||y>m-1)
		return true;
	return false;
}

void dfs(int step,int x,int y)
{
	if(pan(x,y))
	{
		printf("%d step(s) to exit\n",step);
		return ;
	}
	else if(mark[x][y])
	{
		printf("%d step(s) before a loop of %d step(s)\n",book[x][y],step-book[x][y]);
		return ;
	}
	else
	{
		mark[x][y]=1;
		book[x][y]=step;
		if(map[x][y]=='N') dfs(step+1,x-1,y);
		else if(map[x][y]=='S') dfs(step+1,x+1,y);
		else if(map[x][y]=='E') dfs(step+1,x,y+1);
		else if(map[x][y]=='W') dfs(step+1,x,y-1);
	}
	return ;
}

int main()
{
	int i,j,nowx=0,nowy;
	while(~scanf("%d%d",&n,&m) && n+m)
	{
		scanf("%d ",&nowy);
		for(i=0;i<n;i++)
			scanf("%s",map[i]);
		memset(book,0,sizeof(book));
		memset(mark,0,sizeof(mark));
		mark[nowx][nowy-1]=1;
		if(map[nowx][nowy-1]=='N') dfs(1,nowx-1,nowy-1);
		else if(map[nowx][nowy-1]=='S') dfs(1,nowx+1,nowy-1);
		else if(map[nowx][nowy-1]=='E') dfs(1,nowx,nowy);
		else dfs(1,nowx,nowy-2);
	}
	return 0;
}