• LeetCode 2596. 检查骑士巡视方案


    【LetMeFly】2596.检查骑士巡视方案

    力扣题目链接:https://leetcode.cn/problems/check-knight-tour-configuration/

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

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

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

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

     

    示例 1:

    输入:grid = [[0,11,16,5,20],[17,4,19,10,15],[12,1,8,21,6],[3,18,23,14,9],[24,13,2,7,22]]
    输出:true
    解释:grid 如上图所示,可以证明这是一个有效的巡视方案。
    

    示例 2:

    输入:grid = [[0,3,6],[5,8,1],[2,7,4]]
    输出:false
    解释:grid 如上图所示,考虑到骑士第 7 次行动后的位置,第 8 次行动是无效的。
    

     

    提示:

    • n == grid.length == grid[i].length
    • 3 <= n <= 7
    • 0 <= grid[row][col] < n * n
    • grid 中的所有整数 互不相同

    方法一:排序 + 模拟

    创建一个indices数组,indices[i]代表第i步要跳到的位置(只需要遍历一遍grid数组即可完成indices数组)。

    使用两个变量 n o w X nowX nowX n o w Y nowY nowY,代表当前的位置。

    遍历indices数组,如果下一个位置 和 当前位置不是“日”字型,则返回false。

    最终返回true。

    细节描述:

    Q1: 如何确定相邻两个位置是否是日字型?

    A1: 看“横坐标之差×纵坐标之差”是否等于2。

    Q2: 如何优雅地判断骑士是否由“左上角”出发?特判grid[0][0]是否为0不够优雅。

    A2: 初始位置可以设置为(-2, -1),这样首个位置必须是(0, 0)才满足日字型。

    • 时间复杂度 O ( n 2 ) O(n^2) O(n2),其中 s i z e ( g i r d ) = n × n size(gird) = n\times n size(gird)=n×n
    • 空间复杂度 O ( n 2 ) O(n^2) O(n2)

    AC代码

    C++
    typedef pair<int, int> pii;
    class Solution {
    public:
        bool checkValidGrid(vector<vector<int>>& grid) {
            int n = grid.size();
            vector<pii> indices(n * n);
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    indices[grid[i][j]] = {i, j};
                }
            }
            int nowX = -2, nowY = -1;
            for (int i = 0; i < n * n; i++) {
                int nextX =indices[i].first, nextY = indices[i].second;
                if (abs(nowX - nextX) * abs(nowY - nextY) != 2) {
                    return false;
                }
                nowX = nextX, nowY = nextY;
            }
            return true;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    Python
    # from typing import List
    
    class Solution:
        def checkValidGrid(self, grid: List[List[int]]) -> bool:
            n = len(grid)
            indices = [0] * n ** 2
            for i in range(n):
                for j in range(n):
                    indices[grid[i][j]] = [i, j]
            nowX, nowY = -2, -1
            for i in range(n * n):
                nextX, nextY = indices[i]
                if abs(nextX - nowX) * abs(nextY - nowY) != 2:
                    return False
                nowX, nowY = indices[i]
            return True
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~
    Tisfy:https://letmefly.blog.csdn.net/article/details/132847346

  • 相关阅读:
    BUUCTF-PWN-第一页writep(32题)
    资源画像,看得见的容器资源优化助手
    【GPT引领前沿】GPT4技术与AI绘图
    Nacos安装指南
    Fabric: 使用InvokeChaincode实现跨通道数据访问
    ComText让机器人有了情节记忆
    Allegro PCB编辑界面功能全面介绍图文教程
    Redis数据类型-Hash-存储结构之ziplist
    SpringCloud微服务治理技术入门(SCN)
    62. 解释一下MySQL中内连接,外连接等的区别(MySQL面试第五弹)
  • 原文地址:https://blog.csdn.net/Tisfy/article/details/132847346