zoukankan      html  css  js  c++  java
  • 机器人出逃之”Robot Motion“

    题目大意:

      输入三个数 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 }
  • 相关阅读:
    第七次作业--项目需求分析(团队)
    第六次作业--结对编程第二次
    第四次作业--项目选题报告
    alpha冲刺4
    alpha冲刺3
    Alpha 冲刺报告2
    Alpha 冲刺报告
    项目需求分析答辩总结
    项目UML设计(团队)
    项目选题报告答辩总结
  • 原文地址:https://www.cnblogs.com/love-fromAtoZ/p/7551774.html
Copyright © 2011-2022 走看看