2596. 检查骑士巡视方案

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:模拟
  • 写在最后

Tag

【模拟】【数组】


题目来源

2596. 检查骑士巡视方案

2596. 检查骑士巡视方案_第1张图片

题目解读

有一个 n * n 大小的整数矩阵 grid,矩阵内整数范围为 [0, n * n - 1]grid[i][j] 表示单元格 (i, j) 是骑士访问的第 grid[i][j] 个单元格。骑士对单元格的访问是从 (0, 0) 开始的。骑士的有效行动有两种,一种是在水平方向移动两个格子并且竖直方向移动一个格子,另一种是水平方向移动两个格子并且竖直方向移动一个格子。请你判断矩阵 grid 是否表示了骑士的有效行动方案,如果是返回 true,否则返回 false


解题思路

方法一:模拟

grid[i][j] 表示单元格 (i, j) 是骑士访问的第 grid[i][j] 个单元格,我们可以先按照访问从前到后的顺序记录一下骑士访问的单元格,然后进行判断:

  • 因为骑士需要从 (0, 0) 位置开始行动,所以如果访问的第一个单元格,不是从 (0, 0) 位置出发的,直接返回 false

  • 接下来任意两次相邻行动到达的单元格一定要满足:

    • 水平方向上相差两个格子,并且竖直方向相差一个格子;
    • 或者竖直方向上相差两个格子,并且水平方向相差一个格子;
  • 以上两个条件可以简化为 d x 2 + d y 2 = 5 dx^2 + dy^2 = 5 dx2+dy2=5,其中 dx 表示两次相邻行动到达的单元格水平方向上的差值,dy 表示竖直方向上的差值;如果 d x 2 + d y 2 ≠ 5 dx^2 + dy^2 \not= 5 dx2+dy2=5,直接返回 fasle

  • 其他情况返回 true

具体实现中,可以使用一个二维数组 pos 记录骑士按顺序到达的位置。

实现代码

class Solution {
public:
    bool checkValidGrid(vector<vector<int>>& grid) {
        int n = grid.size();
        vector<vector<int>> pos(n*n, vector<int>(2));
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                pos[grid[i][j]][0] = i;
                pos[grid[i][j]][1] = j;
            }
        }

        if (pos[0][0] != 0 || pos[0][1] != 0) return false;
        for (int i = 0; i < n*n - 1; ++i) {
            int dx = abs(pos[i+1][0] - pos[i][0]);
            int dy = abs(pos[i+1][1] - pos[i][1]);
            if ((dx*dx + dy*dy) != 5) return false;
        }
        return true;
    }
};

复杂度分析

时间复杂度: O ( n 2 ) O(n^2) O(n2) n n n 为矩阵的长度(宽度)。

空间复杂度: O ( n 2 ) O(n^2) O(n2),使用的额外空间为记录骑士按顺序到达的位置矩阵。


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 哦。

你可能感兴趣的:(LeetCode每日一题,模拟,数组,C++,算法)