题目大意:
输入三个数 X,Y,Z(X,Y,Z∈[0,10])。
代表一个 X行Y列 的迷宫,入口在 第一行第 Z 列 。
三个变量都等于0的时候结束输入。
迷宫每格有一个字母代表接下来的方向。
询问机器人的行动结果。
具体分为两种:
能用 n 步出去:
输出 n step(s) to exit
先走了 n 步,然后陷入了 m 步的死循环:
输出 n step(s) before a loop of m step(s)
样例:
3 6 5
NEESWE
WWWESS
SNWWWW
4 5 1
SESWE
EESNW
NWEEN
EWSEN
0 0 0
——————
10 step(s) to exit
3 step(s) before a loop of 8 step(s)
解题思路:
递归模拟即可,如果走到了一个你走过的地方,代表死循环了。
标记这个死循环点,返回一个当前步数的相反数。
然后第二次模拟找到这个点的步数。
再求相反数的相反数,一减,就得到了死循环的大小。
AC代码:
1 import java.util.*; 2 3 public class Main{ 4 static int mark[][] = new int[15][15]; 5 static int map[][] = new int[15][15]; 6 static int loopx = 0; 7 static int loopy = 0; 8 9 static int find(int x,int y,int step){ 10 if(map[x][y] == 0){ 11 return step; 12 } 13 else if(map[x][y] == 1){//N 14 if(mark[x][y] == 1){loopx = x;loopy = y;return -step;} 15 mark[x][y] = 1; 16 step ++;return find(x - 1,y,step); 17 } 18 else if(map[x][y] == 2){//S 19 if(mark[x][y] == 1){loopx = x;loopy = y;return -step;} 20 mark[x][y] = 1; 21 step ++;return find(x + 1,y,step); 22 } 23 else if(map[x][y] == 3){//W 24 if(mark[x][y] == 1){loopx = x;loopy = y;return -step;} 25 mark[x][y] = 1; 26 step ++;return find(x,y - 1,step); 27 } 28 else if(map[x][y] == 4){//E 29 if(mark[x][y] == 1){loopx = x;loopy = y;return -step;} 30 mark[x][y] = 1; 31 step ++;return find(x,y + 1,step); 32 } 33 return 0; 34 } 35 36 37 static int sec_find(int x,int y,int step){ 38 if(map[x][y] == 1){//N 39 if(x == loopx && y == loopy){return step;} 40 step ++;return sec_find(x - 1,y,step); 41 } 42 else if(map[x][y] == 2){//S 43 if(x == loopx && y == loopy){return step;} 44 step ++;return sec_find(x + 1,y,step); 45 } 46 else if(map[x][y] == 3){//W 47 if(x == loopx && y == loopy){return step;} 48 step ++;return sec_find(x,y - 1,step); 49 } 50 else if(map[x][y] == 4){//E 51 if(x == loopx && y == loopy){return step;} 52 step ++;return sec_find(x,y + 1,step); 53 } 54 return 0; 55 } 56 57 58 public static void main(String[] args){ 59 Scanner sc = new Scanner(System.in); 60 while(sc.hasNext()){ 61 int x = sc.nextInt(); 62 int y = sc.nextInt(); 63 int in = sc.nextInt(); 64 String enter = sc.nextLine(); 65 if(x == 0 && y == 0 && in == 0){break;} 66 for(int i = 0;i <= 14;i ++){ 67 for(int j = 0;j <= 14;j ++){ 68 map[i][j] = 0; 69 mark[i][j] = 0; 70 } 71 } 72 for(int i = 1;i <= x;i ++){ 73 String t = sc.nextLine(); 74 for(int j = 0;j < t.length();j ++){ 75 if(t.charAt(j) == 'N'){map[i][j + 1] = 1;} 76 if(t.charAt(j) == 'S'){map[i][j + 1] = 2;} 77 if(t.charAt(j) == 'W'){map[i][j + 1] = 3;} 78 if(t.charAt(j) == 'E'){map[i][j + 1] = 4;} 79 } 80 } 81 int out = find(1,in,0); 82 if(out >= 0){System.out.println(out + " step(s) to exit");} 83 else{ 84 out = -out; 85 int before = sec_find(1,in,0); 86 System.out.println(before + " step(s) before a loop of " + (out - before) + " step(s)"); 87 } 88 } 89 90 } 91 }