有个机器人,它根据给定的指令而在一个矩阵行走。指令有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; }