Robot Motion
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 38 Accepted Submission(s) : 13
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description

A robot has been programmed to follow the instructions in its path. Instructions for the next direction the robot is to move are laid down in a grid. The possible instructions are
N north (up the page)
S south (down the page)
E east (to the right on the page)
W west (to the left on the page)
For example, suppose the robot starts on the north (top) side of Grid 1 and starts south (down). The path the robot follows is shown. The robot goes through 10 instructions in the grid before leaving the grid.
Compare what happens in Grid 2: the robot goes through 3 instructions only once, and then starts a loop through 8 instructions, and never exits.
You are to write a program that determines how long it takes a robot to get out of the grid or how the robot loops around.
Input
Output
Sample Input
3 6 5 NEESWE WWWESS SNWWWW 4 5 1 SESWE EESNW NWEEN EWSEN 0 0
Sample Output
10 step(s) to exit 3 step(s) before a loop of 8 step(s)
#include<iostream> using namespace std; int main(void) { int row,col,entry; char grid[12][12]; //在规定大小的grid外部至少再定义一圈"门槛"以判断Robot是否离开了grid (最大grid为10x10) for(;;) { memset(grid,'O',sizeof(grid)); // 'O' 为大写字母O,意为 Out /*Input*/ int i,j; cin>>row>>col>>entry; if(!(row && col && entry))break; for(i=1;i<=row;i++) for(j=1;j<=col;j++) cin>>grid[i][j]; /*Judge Robot get out of the grid or starts a loop in the grid*/ int flag[12][12]={0}; //标记Robot经过某点的次数,当有一点为2则说明Robot陷入了以该点为loop起始点的循环 int count; int r=1; int c=entry; for(count=0;;count++) { flag[r][c]++; //注意顺序,先标记,再位移 if(grid[r][c]=='N') // ↑ r--; else if(grid[r][c]=='S') // ↓ r++; else if(grid[r][c]=='W') // ← c--; else if(grid[r][c]=='E') // → c++; else if(grid[r][c]=='O') // Out { cout<<count<<" step(s) to exit"<<endl; break; } if(flag[r][c]==2) //loop { row=r; //标记Robot循环起止点 col=c; int flg=1; for(r=1,c=entry,count=0;;count++) { if(r==row && c==col && flg==1) //注意顺序,先寻找循环点再位移(避免Robot刚进入grid就陷入了循环的情况) { cout<<count<<" step(s) before a loop of "; //输出进入循环前的步数 count=0; flg++; } if(r==row && c==col && count!=0 && flg==2) { cout<<count<<" step(s)"<<endl; //输出循环步数 break; } if(grid[r][c]=='N') // ↑ r--; else if(grid[r][c]=='S') // ↓ r++; else if(grid[r][c]=='W') // ← c--; else if(grid[r][c]=='E') // → c++; } break; //跳出count的for循环,不是跳出if(当然break也不能用于跳出if,这里的说明是为了避免误解) } } } return 0; }
第二种更简单
#include<iostream> using namespace std; int w,h,t,mark[11][11],s; char map[11][11]; void bfs(int x,int y) {
if(x<0||x>=h||y<0||y>=w) { cout<<s-1<<" step(s) to exit"<<endl; return ; } if(!mark[x][y]) mark[x][y]=s++; else { cout<<mark[x][y]-1<<" step(s) before a loop of "<<s-mark[x][y]<<" step(s)"<<endl; return ; } if(map[x][y]=='W') bfs(x,y-1); else if(map[x][y]=='E') bfs(x,y+1); else if(map[x][y]=='S') bfs(x+1,y); else if(map[x][y]=='N') bfs(x-1,y); } int main() { int i,j; while(cin>>h>>w&&h&&w) { cin>>t; s=1; memset(mark,0,sizeof(mark)); for(i=0;i<h;i++) for(j=0;j<w;j++) cin>>map[i][j]; bfs(0,t-1); } }