Description
给定一个由SNWE几个字母组成的地图,这四个字母代表着四个方向,给定起点,让你判断机器人是否能走出这个地图,或走到某步的时候形成一个环
Input
多组输入,每组用例第一行为三个整数row,col,start分别表示地图的行列数以及机器人从第一行的第几列出发,然后是一个row*col的地图,以row=col=start=0结束输入
Output
对于每组用例,如果机器人能够走出地图则输出其步数,若走到某步形成一个环则输出遇到环之前走的步数以及环的步数
Sample Input
3 6 5
NEESWE
WWWESS
SNWWWW
4 5 1
SESWE
EESNW
NWEEN
EWSEN
0 0 0
Sample Output
10 step(s) to exit
3 step(s) before a loop of 8 step(s)
Solution
先将所有点都标记为0,每走一步就将该点标记为步数,若走到某点发现其标记值不是0则遇到环,那么此时的步数减去该点原先的标记值再加一即为环的步数,该点原先标记值减一即为遇到环之前所走的步数
Code
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define maxn 102
char map[maxn][maxn];
int mark[maxn][maxn];
int row,col,start,step;
int main()
{
while(cin>>row>>col>>start&&row&&col&&start)
{
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
cin>>map[i][j];
memset(mark,0,sizeof(mark));//初始化
step=0;//初始步数为0
int x=0,y=start-1,xx,yy;//从(0,start-1)开始
while(1)
{
mark[x][y]=++step;//标记
if(map[x][y]=='N'){xx=x-1;yy=y;}
if(map[x][y]=='S'){xx=x+1;yy=y;}
if(map[x][y]=='E'){xx=x;yy=y+1;}
if(map[x][y]=='W'){xx=x;yy=y-1;}
if(xx<0||yy<0||xx>=row||yy>=col)//走出地图
{
cout<<step<<" step(s) to exit"<<endl;
break;
}
if(mark[xx][yy]!=0)//遇到环路
{
cout<<mark[xx][yy]-1<<" step(s) before a loop of "<<step-mark[xx][yy]+1<<" step(s)"<<endl;
break;
}
x=xx;y=yy;//更新当前坐标
}
}
return 0;
}