力扣每日一题——蛇梯棋

article/2025/7/19 21:21:05

 

目录

题目链接:909. 蛇梯棋 - 力扣(LeetCode)

题目描述

解法一:BFS+坐标转换

Java写法:

C++写法:

运行时间

时间复杂度和空间复杂度

总结


题目链接:909. 蛇梯棋 - 力扣(LeetCode)

注:下述题目描述和示例均来自力扣

题目描述

给你一个大小为 n x n 的整数矩阵 board ,方格按从 1 到 n2 编号,编号遵循 转行交替方式 从左下角开始 (即,从 board[n - 1][0] 开始)的每一行改变方向。

你一开始位于棋盘上的方格  1。每一回合,玩家需要从当前方格 curr 开始出发,按下述要求前进:

  • 选定目标方格 next ,目标方格的编号在范围 [curr + 1, min(curr + 6, n2)] 。
    • 该选择模拟了掷 六面体骰子 的情景,无论棋盘大小如何,玩家最多只能有 6 个目的地。
  • 传送玩家:如果目标方格 next 处存在蛇或梯子,那么玩家会传送到蛇或梯子的目的地。否则,玩家传送到目标方格 next 。 
  • 当玩家到达编号 n2 的方格时,游戏结束。

如果 board[r][c] != -1 ,位于 r 行 c 列的棋盘格中可能存在 “蛇” 或 “梯子”。那个蛇或梯子的目的地将会是 board[r][c]。编号为 1 和 n2 的方格不是任何蛇或梯子的起点。

注意,玩家在每次掷骰的前进过程中最多只能爬过蛇或梯子一次:就算目的地是另一条蛇或梯子的起点,玩家也 不能 继续移动。

  • 举个例子,假设棋盘是 [[-1,4],[-1,3]] ,第一次移动,玩家的目标方格是 2 。那么这个玩家将会顺着梯子到达方格 3 ,但 不能 顺着方格 3 上的梯子前往方格 4 。(简单来说,类似飞行棋,玩家掷出骰子点数后移动对应格数,遇到单向的路径(即梯子或蛇)可以直接跳到路径的终点,但如果多个路径首尾相连,也不能连续跳多个路径)

返回达到编号为 n2 的方格所需的最少掷骰次数,如果不可能,则返回 -1


解法一:BFS+坐标转换

棋盘布局和移动规则是关键起点​
        棋盘编号从左下角(1号)开始蛇形迂回,最后一行从左到右,倒数第二行从右到左,交替上升。每次移动相当于掷骰子(1-6步),落到普通格子(值为-1)就停下;若落点有梯子或蛇(值非-1),则立刻传送到对应编号的格子,但​​只能传送一次​​——即便新位置又有梯子也不会二次触发。比如落到2号格子若标着15,会直接跳到15,但不会接着触发15号格的传送。

​BFS是解题的核心武器​
        因为每次掷骰算一步,BFS能天然保证最先到达终点的路径步数最少。执行流程:从起点1(步数0)开始,用队列记录当前位置和步数,同时用visited数组避免重复访问。每一步从队列取出当前格子,模拟掷1~6点骰子,计算下一步编号。如果下一步有梯子/蛇,则更新位置到其目标值;如果直达终点(n²号),返回当前步数+1;否则将未访问的位置加入队列。

​坐标转换是最大难点​
二维数组的行列索引和棋盘编号的映射容易出错:

  • ​实际行号​​(从底部计):real_row = (编号 - 1) / n
  • ​数组行索引​​(从顶部计):array_row = n - 1 - real_row
  • ​列索引​​:由real_row的奇偶决定方向——偶数行(0,2,4...)从左到右:col = (编号 - 1) % n;奇数行(1,3,5...)从右到左:col = n - 1 - (编号 - 1) % n。
    例如6x6棋盘中,编号10的real_row=1(奇数行),列需从右向左计算。

​边界和易错点需警惕​
        移动后编号超过n²要跳过;起点(1号)和终点(n²号)保证无梯子/蛇;visited数组防循环(如两个传送门互跳);测试时注意坐标转换是否正确——比如棋盘左上角(编号21)若有梯子board[0][0]=2,若坐标算错会漏传送。

        ​​本质上,这是带传送机制的迷宫最短路径问题​​,BFS配合坐标转换的细心处理即可高效破解。


Java写法:

import java.util.*;class Solution {public int snakesAndLadders(int[][] board) {int n = board.length;int max = n * n;boolean[] visited = new boolean[max + 1];Queue<int[]> queue = new LinkedList<>();queue.offer(new int[]{1, 0});visited[1] = true;while (!queue.isEmpty()) {int[] curr = queue.poll();int pos = curr[0], steps = curr[1];if (pos == max) return steps;for (int i = 1; i <= 6; i++) {int next = pos + i;if (next > max) break;// 修正坐标转换int real_row = (next - 1) / n;int array_row = n - 1 - real_row;int col = (real_row % 2 == 0) ? (next - 1) % n : n - 1 - (next - 1) % n;// 检查传送if (board[array_row][col] != -1) {next = board[array_row][col];}if (!visited[next]) {visited[next] = true;queue.offer(new int[]{next, steps + 1});}}}return -1;}
}

C++写法:

#include <vector>
#include <queue>
using namespace std;class Solution {
public:int snakesAndLadders(vector<vector<int>>& board) {int n = board.size();int max = n * n;vector<bool> visited(max + 1, false);queue<pair<int, int>> q; // <位置, 步数>q.push({1, 0});visited[1] = true;while (!q.empty()) {auto [pos, steps] = q.front();q.pop();if (pos == max) return steps;for (int i = 1; i <= 6; i++) {int next = pos + i;if (next > max) break;// 修正坐标转换int real_row = (next - 1) / n;int array_row = n - 1 - real_row;int col = (real_row % 2 == 0) ? (next - 1) % n : n - 1 - (next - 1) % n;// 检查传送if (board[array_row][col] != -1) {next = board[array_row][col];}if (!visited[next]) {visited[next] = true;q.push({next, steps + 1});}}}return -1;}
};

运行时间

时间复杂度和空间复杂度

时间 O(n^2),空间 O(n^2),BFS确保最短路径




总结

“童趣棋盘暗藏层序遍历精髓——BFS最优雅的应用场景之一。”
​📚 博客硬核内容​​:双语言代码+动态推演+易错案例解析,点击探索坐标转换的数学魔术!


http://www.hkcw.cn/article/HBMFbnxhiv.shtml

相关文章

seq2seq 视频截图

【官方双语】编码、解码神经网络&#xff0c;一个视频讲清楚&#xff0c;seq2seq模型_哔哩哔哩_bilibili 【深度学习 搞笑教程】33 Seq2Seq网络 Attention注意力机制 | 草履虫都能听懂 零基础入门 | 持续更新_哔哩哔哩_bilibili 【深度学习】seq2seq模型/Encoder-Decoder模型及…

俄乌会谈前夕 飞出数只 “黑天鹅” 谈判前景蒙阴影

俄乌第二轮谈判定于6月2日在伊斯坦布尔的契拉昂宫举行。这座宫殿历史可追溯至奥斯曼土耳其时期,目前作为酒店使用。关于本次谈判,俄罗斯代表团已抵达土耳其,由总统助理梅金斯基率领。俄方表示将携带一份备忘录草案和其他停火提议。俄方希望在新一轮谈判中讨论和平协议备忘录…

北京警方现场查扣6辆,专治这种车主 严打非法改装噪音扰民

近期,北京市大兴区南海子公园周边的牡丹园南广场区域夜间常有非法改装摩托车聚集。这些车辆不仅存在安全隐患,巨大的轰鸣声也严重干扰了周边居民的正常休息,引发多起投诉。对此,大兴交通支队开展了改装摩托车专项整治行动,对非法改装、噪音扰民等违法行为进行精准打击。5月…

巴黎圣日耳曼包揽2024/25赛季欧冠最佳阵容 登贝莱获最佳球员

巴黎圣日耳曼前锋登贝莱当选2024-25赛季欧冠最佳球员。在本赛季的欧冠比赛中,他代表巴黎出场15次,其中13次首发,共打入8球并送出6次助攻。在决赛中,登贝莱贡献了2次关键助攻,帮助球队以5-0大胜国际米兰,赢得了队史首座欧冠冠军。责任编辑:zhangxiaohua

对亡人事故负有责任 北京建元筑和建筑装饰工程有限公司被罚50万 安全生产法处罚

北京建元筑和建筑装饰工程有限公司因生产安全事故被处罚。该公司法定代表人为刘振包,统一社会信用代码为91110113MA00ECX81L。2025年3月14日10时许,在密云新北路29号院棚户区改造项目2#楼北侧施工道路中段发生一起车辆伤害事故,导致1人死亡。根据《北京建元筑和建筑装饰工程…

库迪把瑞幸逼到什么份上了? 6.9元限时优惠应战

5月30日,端午节前最后一个工作日,许多人早晨打开瑞幸小程序时发现,原本熟悉的“9.9”元咖啡突然变成了“6.9”元。虽然减的钱不多,但大家还是觉得挺划算的,“本来以为瑞幸九块九已经吸引不了我了,但它都六块九了就来一杯吧”。这一消息迅速传播开来,“瑞幸降价”的话题很…

只办婚礼不领证,年轻人开始一种很新的「婚姻」 爱情与自由的新选择

李晴和男友爱情长跑了9年,多次讨论过结婚生小孩的问题。2019年,男友家决定给他们买婚房,但由于男友征信问题,房子写在了李晴名下。李晴担心如果两人分手,房子会引发纠纷,她向男友坦白自己没有生育打算,并提出分手。男友表示他也不打算要孩子,两人签了协议,约定如何处理…

下一轮节假日在4个月后 国庆中秋连放8天

今天是端午节假期的最后一天,大家或许已经在期待下一次休假。根据国务院办公厅关于2025年部分节假日安排的通知,今年下一次长假将在4个月后的国庆节和中秋节期间。届时,国庆节和中秋节将合并放假8天。责任编辑:zhangxiaohua

嵌入式学习笔记 - FreeRTOS v9.0.0 与v10.0.1不同版本占用资源对比,以及TOTAL_HEAP_SIZE设置大小

一 资源占用对比 以下为用示例对比freeRTOS v9.0.0版本以及v10.0.1版本占用资源的境况&#xff0c;两者均在运行完全相同的任务包括任务内容与数量的情况进行对比&#xff0c;任务的创建均使用静态内存方式创建&#xff0c;每个任务的任务堆栈均设置相同大小&#xff0c;并且f…

装有87万元的行李箱赶高铁遗失 20分钟巨款物归原主

端午假期期间,深圳北站迎来客流高峰,单日发送和到达旅客突破50万人次。在这繁忙的出行场景中,一个装有87万元现金的行李箱与主人意外分离。5月31日9时41分,深圳北站派出所的两名公安干警在巡视候车室时发现了一个无人认领的白色行李箱,立即告知车站客运车间工作人员。工作…

day42python打卡

知识点回顾 1.回调函数 2.lambda函数 3.hook函数的模块钩子和张量钩子 4.Grad-CAM的示例 作业&#xff1a;理解下今天的代码即可 Grad-CAM 在深度学习中&#xff0c;我们经常需要查看或修改模型中间层的输出或梯度。然而&#xff0c;标准的前向传播和反向传播过程通常是一个…

一纸规划让沉寂多年高庙村热闹起来 乡村焕发新生机

从空中俯瞰紧邻长寿湖的长寿区石堰镇高庙村,建设正如火如荼推进。5月21日,日上三竿,刚从地里摘完蔬菜的孔祥辉回到家里,发现92岁的婆婆没在屋里。“啊,没在!准是去湖边了。最近兴致高,天气这么大都要去。”孔祥辉不禁说道。孔祥辉是长寿区石堰镇高庙村村民,她口中的“湖…

中国女排世联赛北京站名单揭晓 阵容公布引发期待

北京时间6月2日,中国排球协会公布了中国女排参加世界联赛北京站的名单。主攻位置上,队伍选择了吴梦洁、庄宇珊、唐欣和董禹含;副攻则由王媛媛、万梓玥、单琳倩、陈厚羽以及王奥芊组成;接应方面,龚翔宇担任队长,杨舒茗和范泊宁也入选了名单;二传位置上是邹佳祺、殷小岚和…

北京一男子端午节独爬野山被困,还执意自己找路!27人连夜冒雨搜山 自信过度险酿祸

5月31日端午节,在北京房山一处野山中,一名男子登山迷路。他联系警方询问下山路,警方随即联动了房山蓝天救援队。晚上8点多,当救援队员试图获取更多信息时,该男子表示只想问路,并拒绝了救援队的帮助,坚持自己下山。尽管如此,为了确保他的安全,救援队还是启动了救援程序…

如何在 Windows 11 中添加环境变量

在 Windows 11 中,可以通过图形用户界面轻松设置环境变量 (env)。Windows 或其他操作系统需要环境变量来准确了解重要文件的存储位置。这些位置在每台计算机上可能会有所不同。对于大多数 Windows 用户而言,系统通常位于 C:\Windows\ 文件夹中,而应用程序则一般情况下默认是…

张家界溶洞垃圾已打捞2.7吨 排污事件引发关注

近日,有网友反映张家界市慈利县一处天然溶洞被人为排污,导致溶洞受到污染。相关话题引起了广泛关注。据慈利县融媒体中心6月1日发布的最新视频,经过7天的努力,清理打捞杨家坡溶洞垃圾2.7吨。相关视频显示,溶洞内的垃圾正在被装袋并使用吊机吊出,旁边已经堆放了大量袋装好…

美国卡车侧翻 2.5亿只蜜蜂“出逃” 养蜂人紧急救援

当地时间5月30日,美国西北部的华盛顿州发生了一起车祸。一辆卡车后的拖车侧翻,导致约2.5亿只蜜蜂飞出。有关部门随即发布通知,提醒公众提高警惕,小心被蜇。车祸发生后,附近的养蜂人纷纷赶往现场帮忙,收集从车上滚落的蜂箱并妥善安置。应急部门也封闭了该区域的多条道路,…

北京:男子端午节爬野山迷路,还执意自己找路!27人冒雨搜山救援 最终成功救出

5月31日端午节,在北京房山一处野山中,一名男子登山迷路,但他不想麻烦救援队,坚持要自己摸索下山。男子曾给警方打电话询问下山道路,警方随后联系了房山蓝天救援队。晚上8点多,当救援队员询问男子详细信息时,他却表示只想问问路,并拒绝了救援队员的帮助。尽管被困男子未…

曼联给加纳乔标价4000万英镑,球迷愤怒 全欧将嘲笑我们

曼联球迷在社交媒体上对俱乐部可能降价出售加纳乔表示质疑。据称,曼联最初为这位边锋标价5000万英镑,但随着那不勒斯的兴趣增加,实际售价可能降至4000万英镑。一位球迷在社交媒体上愤怒地表示,如果以4000万英镑的价格出售加纳乔,全欧洲都会嘲笑曼联。另一名球迷指出,其他…

ck-editor5的研究 (1):快速把 CKEditor5 集成到 nuxt 中

前言 最近有用到 CKEditor5, 有点头大&#xff0c;只能在业余时间研究一下了。一看他们的文档&#xff0c;结果发现有点难以理解&#xff08;我阅读理解一直很差&#xff09;&#xff0c;看了许久&#xff0c;还是对他们的设计概念有点云里雾里的。为了不浪费时间&#xff0c;…