“树人杯”暨第三届辽宁科技大学校园程序设计竞赛正赛C 机器人(蓝)

有个机器人,它根据给定的指令而在一个矩阵行走。指令有E,W,S,N四种分别代表东(east),西(west),南(south),北(north).直到出现回路(走到已经走过的地方)或者走出范围才结束,要求输出结束的坐标和结束的理由。 

举个例子,如图1,它从起始位置开始(此时它处在(0,4)的位置),遇到的是W所以向西走,走到(0,3)的位置。又遇到S,于是向南走到(1,3)的位置…最后到(1,0)的位置遇到W,向西走就走出范围了,此时就结束并将结束是的位置输出。此时应该输出
(1,0) to exit
同样的走法,在图2中当它走到(0,2)的时候遇到S然后走到(1,2),而
(1,2)是之前走过的(出现了回路)。此时也是满足结束的条件,这时应该输出
(1,2) to a loop

输入的第一行为整数T(T>0)表示有组测试数据。接下来的T组测试数据,每组都以N,M,I,J(0〈N ,M〈=20)开头。N和M分别表示行和列的个数。I,J分别表示机器人的开始坐标。然后是N行M列的矩阵,其中的元素表示指令。
如果是因为出界而结束的,输出结束时的坐标加to exit ,例如 (1,0) to exit
如果是因为出现回路而结束的,输出出现回路的坐标加to a loop ,例如 (1,2) to a loop

Input

Output

Sample Input

2
3 6 0 4
N E E S W E
W W W E S S
S N W W W W
4 5 0 0
S E S W E
E E S N W
N W E E N
E W S E N

Sample Output

(1,0) to exit
(1,2) to a loop
#include<iostream>
using namespace std;
char map[15][15];
void zoulu(int &i,int &j)
{
if(map[i][j]=='W')
j=j-1;
else if(map[i][j]=='E')
j=j+1;
else if(map[i][j]=='S')
i=i+1;
else if(map[i][j]=='N')
i=i-1;
}
int main()
{
int a,n,i,j,k;
memset(map,'0',sizeof (map) );
cin>>a;
bool biaoji[1000][1000];
bool p=true;
while(a--)
{
memset(biaoji,false,sizeof (biaoji) );
int a[4];
for(i=0;i<4;i++)
cin>>a[i];
for(i=0;i<a[0];i++)
{
for(j=0;j<a[1];j++)
{
cin>>map[i][j];
}
}
n=a[2];
k=a[3];
int tn,tk;
while(map[n][k]=='W' || map[n][k]=='S' || map[n][k]=='E'|| map[n][k]=='N')
{
if(biaoji[n][k]==true)
{
p=false;
tn=n;
tk=k;
break;
}
if(n<0 || k<0 || n >= a[0] || k>= a[1])
break;
tn=n;
tk=k;
biaoji[n][k]=true;
zoulu(n,k);
}
if(p==true)
{
cout<<"("<<tn<<","<<tk<<")"<<" to exit"<<endl;
}
else
cout<<"("<<n<<","<<k<<")"<<" to a loop"<<endl;
p=true;
}
return 0;
}
原文地址:https://www.cnblogs.com/anderson0/p/1445345.html