机器人出逃之”Robot Motion“

本文介绍了一种通过递归模拟解决迷宫问题的方法,利用Java实现机器人在迷宫中的导航,区分正常路径与死循环,并提供了详细的算法思路及AC代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:

  输入三个数 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 }

 

转载于:https://www.cnblogs.com/love-fromAtoZ/p/7551774.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值