简单机器人模拟
题目:(zju1708: Robot Motion)
以矩阵形式给定一张地图和机器人的初始位置。矩阵上每一点的字母代表在这一点机器人的移动方向。如果机器人按图中信息能走出的话输出需要的步数。如果机器人进入某个循环则输出循环前所走的步数和循环的长度。
v Sample Input
v 3 6 5 //地图行列大小和机器人起始点
NEESWE //NESW分别表示North,East,South,West四个方向
WWWESS
SNWWWW
4 5 1 //另一个TEST
SESWE
EESNW
NWEEN
EWSEN
0 0 0 //000结束输入
v Sample Output
10 step(s) to exit
3 step(s) before a loop of 8 step(s)
源程序如下:
#include<iostream>
using namespace std;
int data[100][100];
int row,col; //地图行列数
void move(int r,int c)
{
int step=1; //记录每个坐标的步数信息(开始是第一步)
bool Noexit=true; //是否已经出界状态(开始肯定没出界^_^)
while(Noexit&&data[r][c]<0) //要判断是否出界还要判断以前是否路过
{
int tmp=data[r][c];
data[r][c]=step++; //路过一个坐标就把这个坐标的值定为步数
//由于非负,正好说明了此点已走过
switch(tmp) //依方向前进
{
case -1:--r; break;
case -2:++r; break;
case -3:--c break;
case -4:++c; break;
}
Noexit=( r>=0&&r<row&&c>=0&&c<col);//更新出界状态
}
if(!Noexit) //出界了,说明已经走出
cout<<step-1<<" step(s) to exit"<<endl;
else //没出界,说明碰到了原路径,循环去了,走不出去
cout<<data[r][c]-1<<" step(s) before a loop of "
<<step-data[r][c]<<" step(s)"<<endl;
}
int main()
{
int a,b,c,i,j;
char ch;
while((cin>>a>>b>>c)&&a)
{
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{
cin>>ch; //输入地图,为了方便用-1到-4表四个方向
switch(ch)
{
case'N':data[i][j]=-1; break;
case'S':data[i][j]=-2; break;
case'W':data[i][j]=-3; break;
case'E':data[i][j]=-4; break;
}
}
row=a; //从输入中得到地图行列数
col=b;
move(0,c-1); //从0行c-1列起点进行模拟前进
}
}
评论