/*
这题看起来好吓人,但是慢慢看下去,会发现就是简单那的
模拟题,也可以说是简单的搜索,不过搜索的方向是题目告诉的
方向,只要判断两个点就够了,一是直接出去的时候,
二是:当在某个时候一直在里面循环!!
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char s[12][12];
int n,m,t;
int step[12][12];
int flag,k,k1;
void dfs(int x,int y,char c)
{
int xx,yy;
xx=x;
yy=y;
if(c=='N')xx-=1;
else if(c=='S')xx+=1;
else if(c=='E')yy+=1;
else if(c=='W')yy-=1;
if(xx<0||xx>=n||yy<0||yy>=m)//这里就是判断是不是出去了
{
flag=1;
k=step[x][y]+1;
return;
}
if(step[xx][yy]>-1)//其实这里就是判断是不是进入了循环,因为一旦进入循环了,那么step[x][y]就会有数,就会大于-1
{
k1=step[xx][yy];//那么这个k就是一开始到达要循环的那个点的步数
k=step[x][y]+1;
return;
}
step[xx][yy]=step[x][y]+1;
dfs(xx,yy,s[xx][yy]);
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&m),n+m)
{
scanf("%d%*c",&t);
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
scanf("%c",&s[i][j]);
}
getchar();
}
memset(step,-1,sizeof(step));
flag=0;
k=0;
k1=0;
step[0][t-1]=0;
dfs(0,t-1,s[0][t-1]);
if(flag)
{
printf("%d step(s) to exit\n",k-k1);
}
else
{
printf("%d step(s) before a loop of %d step(s)\n",k1,k-k1);
}
}
return 0;
}
HDU 1035 简单搜索,
最新推荐文章于 2019-08-22 17:40:11 发布