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

news2025/1/22 19:01:48

来源:力扣(LeetCode)

描述:

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

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

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

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

1

示例 1:

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 中的所有整数 互不相同

方法:直接模拟

思路与算法

题目要求骑士的移动的每一步均按照「日」字形跳跃,假设从位置 (x1, y1) 跳跃到 (x2, y2),则此时一定满足下面两种情形之一:

  • ∣x1 − x2∣ = 1, ∣y1 − y2 ∣ = 2;
  • ∣x1 − x2∣ = 2, ∣y1 − y2∣ = 1。

设矩阵的长度为 n,其中 grid[row][col] 表示单元格 (row, col) 是骑士访问的第 grid[row][col] 个单元格,因此可以知道每个单元格的访问顺序,我们用 indices 存储单元格的访问顺序,其中 indices[i] 表示骑士在经过第 i − 1 次跳跃后的位置。由于骑士的行动是从下标 0 开始的,因此一定需要满足 grid[0][0] = 0,接下来依次遍历 indices 中的每个元素。由于 indices[i] 是一次跳跃的起点,indices[i+1] 是该次跳跃的终点,则依次检测每一次跳跃的行动路径是否为「日」字形,即满足如下条件:

  • ∣indices[i][0] − indices[i+1][0]∣ = 1,∣indices[i][1] − indices[i+1][1]∣= 2;
  • ∣indices[i][0] − indices[i+1][0]∣ = 2,∣indices[i][1] − indices[i+1][1]∣= 1。

为了方便计算,我们只需检测 ∣x1 − x2∣ × ∣y1 − y2∣ 是否等于 2 即可。如果所有跳跃路径均合法则返回 true ,否则返回 false。

代码:

class Solution {
public:
    bool checkValidGrid(vector<vector<int>>& grid) {
        if (grid[0][0] != 0) {
            return false;
        }
        int n = grid.size();
        vector<array<int, 2>> indices(n * n);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                indices[grid[i][j]] = {i, j};
            }
        }
        for (int i = 1; i < indices.size(); i++) {
            int dx = abs(indices[i][0] - indices[i - 1][0]);
            int dy = abs(indices[i][1] - indices[i - 1][1]);
            if (dx * dy != 2) {
                return false;
            }
        }
        return true;
    }
};

时间 16ms 击败 69.53%使用 C++ 的用户
内存 27.05MB 击败 23.43%使用 C++ 的用户
复杂度分析

  • 时间复杂度:O(n2),其中 n 表示二维棋盘边的长度。需要检测棋盘中的每个位置,一共需要检测 n2 个位置,因此时间复杂度为 O(n2)。
  • 空间复杂度:O(n2),其中 n 表示二维棋盘边的长度。用来需要存放每个位置的访问顺序,一共有 n2 个位置,需要的空间为 O(n2)。
    author:力扣官方题解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1007105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无涯教程-JavaScript - ISERR函数

描述 如果ISERR函数引用的是Excel错误(&#xff03;N/A错误除外),则ISERR函数返回逻辑值TRUE。否则返回FALSE。 语法 ISERR (value)争论 Argument描述Required/OptionalvalueAn errorRequired Notes 此函数在公式中用于测试计算输出很有用。与IF函数结合使用时,此函数提供…

综合能力 ---- 2. 法律法规

1. 法律法规 1.1 电信条例 电信条例概述电信市场规定电信服务规定电信建设规定电信安全规定 1.2 网间互联管理规定 网间互联概述经营者的互联义务互联时限 1.3 网络安全法 网络安全法概述网络运行安全规定网络信息安全规定 2. 电信条例修订的目的 《电信条例》于2016年做…

fatal error: linux/compiler-gcc9.h: No such file or directory

linux 找到README文件 cd /mnt/e/CLionProjects/linux-3.10.99/linux-3.10.99 sudo useradd linux3x sudo passwd linux3x sudo mkdir /home/linux3x sudo chown linux3x:linu3x /home/linux3x sudo chmod 755 /home/linux3x su - linux3x mkdir ~/build mkdir ~/build/kerne…

精品基于NET实现的民族文化宣传网站

《[含文档PPT源码等]精品基于NET实现的民族文化宣传网站》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具&#xff1a; 开发软件&#xff1a;VS 2017 &#xff08;版本2017以上即可&#xff0c;不能低于2017&#xff09; 数…

python 语法入门

文章目录 前言python 语法入门1. 语句分隔符2. 注释3. pep8规范4. 变量5. 扩展5.1. 运行此行代码的过程 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会…

分享一下在微信小程序上怎么实现投票功能

微信小程序已经成为一种非常受欢迎的移动应用&#xff0c;可以通过它来实现各种功能&#xff0c;包括投票功能。下面&#xff0c;我们将为大家详细介绍如何在微信小程序上实现投票功能。 一、确定投票功能的目标 在策划投票功能之前&#xff0c;需要明确自己的目标。目标可以是…

【python】CliffWalking悬崖寻路问题

强化学习 简介gym库-CliffWalkingSARSAQ-learning 示例SARSAQ-learning 简介 机器学习&#xff1a;监督学习、非监督学习、强化学习 模仿人类和动物的试错机制进行学习智能体与环境交互&#xff0c;根据当前的环境状态s&#xff0c;按照一定策略采取行动a&#xff0c;获得回报r…

使用 CSS 伪类的attr() 展示 tooltip

效果图: 使用场景: 使用React渲染后台返回的数据, 遍历以列表的形式展示, 可能简要字段内容需要鼠标放上去才显示的 可以借助DOM的自定义属性和CSS伪类的attr来实现 所有代码: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-…

Linux之文本搜索工具--grep

目录 Linux之文本搜索工具--grep 作用 格式 参数 注意 示例 操作对象文件&#xff1a;/etc/passwd grep过滤命令示例 Linux之文本搜索工具--grep 作用 grep是linux中一种强大的文件搜索过滤工具&#xff0c;可以按照正则表达式检索文件内容&#xff0c;并把匹配的结果显…

Ubuntu安装与配置MySQL简要记录

目标 前置条件&#xff1a;Virtualbox虚拟机下Ubuntu20.04 目标MySQL版本&#xff1a;8.0.34 目标效果&#xff1a;安装并配置MySQL&#xff0c;开启远程连接且使用windows下的DataGrip进行管理 安装 sudo apt install mysql-server 通过apt安装的mysql只需一行&#xff0c;…

LeetCode——动态规划篇(一)

刷题顺序及思路来源于代码随想录&#xff0c;网站地址&#xff1a;https://programmercarl.com 目录 509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; 70. 爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 746. 使用最小花费爬楼梯 - 力扣&#xff08;LeetCode&a…

【C++】泛型编程 | 函数模板 | 类模板

一、泛型编程 泛型编程是啥&#xff1f; 编写一种一般化的、可通用的算法出来&#xff0c;是代码复用的一种手段。 类似写一个模板出来&#xff0c;不同的情况&#xff0c;我们都可以往这个模板上去套。 举个例子&#xff1a; void Swap(int& a, int& b) {int tmp …

智能驾驶感知技术的综述与展望

目录 1 智能驾驶环境感知的目的 1.1 智能驾驶感知技术的定义和作用 1.2 基于传感器的智能驾驶感知技术 1.3 基于深度学习的智能驾驶感知技术 2 环境感知的手段与方法 2.1 感知技术在智能驾驶中的应用与发展 2.2 智能驾驶决策系统的设计与优化 2.3 控制技术在智能驾驶中的应…

SpringMVC之JSON返回异常处理机制

json处理统一异常处理 1.json处理 //pom.xml <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"…

加快项目开发进度常用5种方法

项目进度管理是根据进度目标&#xff0c;制定合理的进度计划&#xff0c;全程监控项目进度的执行情况。这样有利于明确项目目标&#xff0c;协调团队行动&#xff0c;提高开发效率&#xff0c;从而最大化项目利益。而加快项目进度&#xff0c;有利于提高项目整体效率&#xff0…

我的创作纪念日——1个普通网安人的漫谈

机缘 大家好&#xff0c;我是zangcc。今天突然收到了一条私信&#xff0c;才发现来csdn已经1024天了&#xff0c;不知不觉都搞安全渗透2年半多了&#x1f414;&#xff0c;真是光阴似箭。 我写博客的初衷只是记录自己的学习历程&#xff0c;比如打打靶场&#xff0c;写一下通关…

高成本获客时代,企业如何通过营销自动化实现突围?

在数字化时代&#xff0c;随着市场竞争的不断升级&#xff0c;企业在获客方面面临了前所未有的挑战。不论是B端或C端的市场和运营部门纷纷寻求可降低获客成本的新运营路径&#xff0c;将有限的预算花在刀刃上。 企业迫切需要寻求更加智能和高效的方式来吸引、转化和留住潜在客…

QGC 参数设置中关于param_union的使用

在QGC中在设置飞控参数中使用到了union,此处关于param_uinon使用的理解进行记录。 参数上传 在参数上传中根据参数类型将参数存储在param_union对应的类型中&#xff0c;但是上传参数时&#xff0c;上传的是param_float类型&#xff0c;所以在飞控端接收时&#xff0c;需要使…

JSON与实体类之间的互相转换!!

一、意义 在我们调用三方平台接口时&#xff0c;经常需要将我们封装的实体类转换为json作为传参&#xff0c;或者是当我们接收报文时接收的为json数据想要转换为我们自己封装的实体类。 1实体类转JSON public static void main(String[] args) throws JsonProcessingExceptio…

“深入理解SpringMVC的JSON数据返回和异常处理机制“

目录 引言1. SpringMVC之JSON数据返回1.1 导入依赖1.2 配置弹簧-MVC.xml1.3 ResponseBody注解使用1.4.Jackson 2. 异常处理机制2.1 为什么要全局异常处理2.2 异常处理思路2.3 SpringMVC异常分类2.4 综合案例 总结 引言 在现代Web开发中&#xff0c;SpringMVC是一个广泛使用的框…