解题思路:


不知道咋说,就一眼就能看出来怎么解。一个for解决。搞好字典序的顺序就行

注意事项:


这道题坑人的地方就是 x y 的输入,按照正常人的逻辑应该是 x为列,y为行,但是这道题的数据输入变成了x为行,y为列,这一块需要注意。

还有就是这道题说了x和y都是已0作为起点的,所以不需要考虑数组下标从哪里开始。


参考代码:

import java.util.Scanner;

public class Main{

    // 题目地址:https://www.dotcpp.com/oj/problem1429.html

    // 需要注意,我的方向是有排列顺序的上->右->下->左 对应右转。反之对应左转。
    private static final String direction = "URDL";

    // 不同转的方向,进行的位置数值的变动
    private static final int[] pos_x = {0, 1, 0, -1};
    private static final int[] pos_y = {-1, 0, 1, 0};

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int m = scanner.nextInt(), n = scanner.nextInt();
        int x, y, k;
        char s;
        int[][] grid = new int[m][n];

        // 输入
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                grid[i][j] = scanner.nextInt();
            }
        }

        x = scanner.nextInt();
        y = scanner.nextInt();
        s = scanner.next().toCharArray()[0];
        k = scanner.nextInt();

        // 已步数来循环
        for (int i = 0; i < k; i++) {
            // 转向
            s = spin(grid[x][y], s);
            // 改变但前格的颜色
            grid[x][y] = grid[x][y] == 0 ? 1 : 0;
            // 获取方向的下标
            int s_direction = direction.indexOf(s);
            // 进行方向操作
            // 这里就是需要注意的,x y 此时的逻辑是相反的
            int x1 = x + pos_y[s_direction];
            int y1 = y + pos_x[s_direction];
            // 是否越界
            if(x1 >= 0 && y1 >= 0 && x1 < n && y1 < m){
                x = x1;
                y = y1;
            }
        }
        // 输出 x y
        System.out.println(x + " " + y);
    }

    // 旋转,并返回旋转后的位置
    public static char spin(int a, char nowDirection) {
        // 获取到当前方向在字典序中的位置
        int pos = direction.indexOf(nowDirection);
        // 白格 左转
        if (a == 0) {
            // 左转则字典序往前一位
            pos--;
            // 特殊考虑如果到了第一个,则跳到字典序的最后一个位置
            if (pos < 0) {
                pos = 3;
            }
            // 黑格 右转
        } else {
            // 右转则字典序往后一位
            pos++;
            // 特殊考虑如果到了最后一个,则回到字典序的第一个位置
            if (pos > 3) {
                pos = 0;
            }
        }
        // 放回一下获取到的新方向
        return direction.toCharArray()[pos];
    }
}


 

0.0分

1 人评分

  评论区

  • «
  • »