Day 27:2596. 检查骑士巡视方案

92 阅读2分钟

Leetcode 2596. 检查骑士巡视方案

骑士在一张 n x n 的棋盘上巡视。在 **有效 **的巡视方案中,骑士会从棋盘的 左上角 出发,并且访问棋盘上的每个格子 恰好一次

给你一个 n x n 的整数矩阵 grid ,由范围 [0, n * n - 1] 内的不同整数组成,其中 grid[row][col] 表示单元格 (row, col) 是骑士访问的第 grid[row][col] 个单元格。骑士的行动是从下标 0 开始的。

如果 grid 表示了骑士的有效巡视方案,返回 true;否则返回 false。

注意,骑士行动时可以垂直移动两个格子且水平移动一个格子,或水平移动两个格子且垂直移动一个格子。下图展示了骑士从某个格子出发可能的八种行动路线。

image.png

记录当前所在位置,判断 8 个方向是否有符合要求的结果。
但测试中有个比较恶心的值, grid[0][0]不等于 0,这个是初始条件就不符合题意的,因此直接返回 false

完整代码

class Solution {
    int x = 0;
    int y = 0; // x, y 当前所在位置
    int n; // 矩阵大小
    public boolean checkValidGrid(int[][] grid) {
        if (grid[0][0] != 0) return false;
        n = grid.length;
        for (int i = 1; i < n * n; i++) {
            if (!checkGrid(grid, i)) {
                // System.out.println(i);
                return false;
            }
        }

        return true;
    }

    public boolean checkGrid(int[][] grid, int num) {
        // System.out.println(x + " " + y);
        if (x - 2 >= 0 && y + 1 < n && grid[x - 2][y + 1] == num) {
            x = x - 2;
            y = y + 1;
            return true;
        } else if (x - 1 >= 0 && y + 2 < n && grid[x - 1][y + 2] == num) {
            x = x - 1;
            y = y + 2;
            return true;
        } else if (x + 1 < n && y + 2 < n && grid[x + 1][y + 2] == num) {
            x = x + 1;
            y = y + 2;
            return true;
        } else if (x + 2 < n && y + 1 < n && grid[x + 2][y + 1] == num) {
            x = x + 2;
            y = y + 1;
            return true;
        } else if (x + 2 < n && y - 1 >= 0 && grid[x + 2][y - 1] == num) {
            x = x + 2;
            y = y - 1;
            return true;
        } else if (x + 1 < n && y - 2 >= 0 && grid[x + 1][y - 2] == num) {
            x = x + 1;
            y = y - 2;
            return true;
        } else if (x - 1 >= 0 && y - 2 >= 0 && grid[x - 1][y - 2] == num) {
            x = x - 1;
            y = y - 2;
            return true;
        } else if (x - 2 >= 0 && y - 1 >= 0 && grid[x - 2][y - 1] == num) {
            x = x - 2;
            y = y - 1;
            return true;
        }
        return false; 
    }
}