ACM Robot Motion
机器人已被编程为按照其指令中的路径进行操作。机器人要移动的下一个方向的指令放在网格中。可能的指令是
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)
例如,假设机器人从网格1的北面(顶部)开始,然后开始向南(下)。机器人的路径如图所示。在离开网格之前,机器人会在网格中执行10条指令。
比较一下网格2:机器人只经过3次指令,然后通过8条指令开始循环,从不退出。
您要编写一个程序,用于确定机器人离开网格所需的时间以及机器人环绕的周期。Input
将有一个或多个网格用于漫游器导航。每个数据的格式如下。第一行是三个整数,以空格分隔:网格中的行数,网格中的列数以及机器人从北方进入的列数。可能的条目列从左侧开始编号。然后来排列方向说明。每个网格将具有至少一个,最多十行和多列指令。指令行仅包含没有空格的字符N,S,E或W。输入结束由含0 0 0的行表示。
Output
对于输入中的每个网格,都有一行输出。机器人遵循一定数量的指令,并在四方面的任何一个上退出网格,否则机器人会按照一定数量的位置上的指令进行一次,然后重复一些位置上的指令。下面的样本输入对应于上面的两个网格,并说明了两种形式的输出。 “step”一词紧随其后的是“(s)”,前面的数字是否为1。
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)
1 #include<stdio.h> 2 #include<bits/stdc++.h> 3 using namespace std; 4 char paths[1005][1005]; 5 int step[1005][1005]; 6 int r,c,start,row,col,exitstep,diestep,diex,diey; 7 bool die = false; 8 /*感想:实现递归的过程,一定要注意代码的整洁,不是指格式,而是逻辑思路, 9 就像数学的提取公因式一样,不要把同样的语句写太多遍,重复语句的执行会增加运行时间, 10 简单说,有可能因为的重复语句,不能实现AC目的*/ 11 void solve(int row,int col,int num) 12 { 13 if(row < 0|| col < 0 || row >= r || col >= c) /*跳出网格*/ 14 { 15 exitstep = num; 16 return; 17 } 18 if(step[row][col]) /*陷入循环*/ 19 { 20 die = true; 21 diex = col; 22 diey = row; 23 diestep = step[row][col]; 24 step[row][col] = num - step[row][col]; 25 return; 26 } 27 //cout<<paths[row][col]<<endl; 28 step[row][col] = num; 29 if(paths[row][col] == 'N') 30 solve(row-1,col,num+1); 31 else if(paths[row][col] == 'S') 32 solve(row+1,col,num+1); 33 else if(paths[row][col] == 'E') 34 solve(row,col+1,num+1); 35 else if(paths[row][col] == 'W') 36 solve(row,col-1,num+1); 37 } 38 39 int main() 40 { 41 while(cin>>r>>c,r||c) 42 { 43 cin>>start; 44 for(int i = 0; i < r; i++) 45 scanf("%s",paths[i]); 46 memset(step,0,sizeof(step)); 47 die = false; 48 start = start -1; 49 solve(0,start,1); 50 if(die) //3 step(s) before a loop of 8 step(s) 51 cout<< --diestep<<" step(s) before a loop of "<<step[diey][diex]<<" step(s)"<<endl; 52 else //10 step(s) to exit 53 cout<<--exitstep<<" step(s) to exit"<<endl; 54 } 55 return 0; 56 }