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.
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.
3 6 5 NEESWE WWWESS SNWWWW 4 5 1 SESWE EESNW NWEEN EWSEN 0 0
10 step(s) to exit 3 step(s) before a loop of 8 step(s)
题目大致看懂了,想起之前老师教过深搜的,就用了,但是不知道怎么下手。百度哪些奇奇怪怪的,最后还是自己写了。一开始是直接用三个数组,一个存地图一个存步数一个判断是否走过,但是超时了。最后解决了。开心
#include<iostream> using namespace std; char map[300][300]; int step[300][300]={0}; int r[4]={0,-1,0,1}; int c[4]={1,0,-1,0}; int row,col,n,m,st; void dfs(); void output(); void out(int x,int y); int judge(int x,int y); int main() { int i,j; while(1) { cin>>n>>m>>col; row=1; st=0; if(n==0&&m==0) { break; } for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { cin>>map[i][j]; } } dfs(); } return 0; } void dfs() { int j; if(row<1||col<1||row>n||col>m) { output(); } else if(map[row][col]=='0') //为零则说明有循环部分。 { out(row,col); } else { j=judge(row,col); map[row][col]='0';//最关键的部分,走过后就换为0,可以代替判断是否走过的数组。 step[row][col]=st; st+=1; row+=r[j],col+=c[j]; dfs(); } } int judge(int x,int y) { if(map[x][y]=='E') { return 0; } if(map[x][y]=='N') { return 1; } if(map[x][y]=='W') { return 2; } if(map[x][y]=='S') { return 3; } } void output() { cout<<st<<" step(s) to exit"<<endl; } void out(int x,int y) { cout<<step[x][y]<<" step(s) before a loop of "<<(st-step[x][y])<<" step(s)"<<endl; }