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。
注意,骑士行动时可以垂直移动两个格子且水平移动一个格子,或水平移动两个格子且垂直移动一个格子。下图展示了骑士从某个格子出发可能的八种行动路线。
记录当前所在位置,判断 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;
}
}