- 科学计算
【免费下载链接】codeforces-go
算法竞赛模板库 by 灵茶山艾府 💭💡🎈
本篇文章基于 codeforces-go 仓库中 leetcode/biweekly/192/a/README.md 的官方题解,深入讲解「皇后(Queen)到达目标格子的最少移动步数」这一经典棋盘思维题:如何通过「同行、同列、同对角线」三要素把答案压缩到最多两步,并给出 Python / Java / C++ / Go 四种语言的完整实现。读完本文,你将掌握国际象棋皇后直线与斜线可达性的数学判定(sr+sc == tr+tc与sr-sc == tr-tc),以及如何在本仓库的 LeetCode 题目模板下用测试文件一键验证答案。
一、题目背景:皇后的走法与本题的核心观察
国际象棋中的皇后(Queen)可以在一步之内沿着任意方向移动任意格数,但方向必须满足以下三者之一:
- 水平方向(行相同,列不同);
- 垂直方向(列相同,行不同);
- 两条对角线方向(行列差的绝对值相同)。
也就是说,只要起点与目标位于同一条直线或同一条斜线,皇后一步就能到达。据此可以立刻推出本题最重要的结论:
皇后从任意格子出发,到达任意目标格子的最少步数最多只有 2 步。
原因是:棋盘上任意两个格子,总能通过「先横走到与目标同列的位置,再竖走到目标」的方式,用两步完成(或者先竖后横)。因此答案的取值只可能是0、1、2三种,问题退化为一个纯粹的"分类讨论"——这也是本题(以及同类的 4034. 象到达目标格子的最少移动步数 问题,即 Bishop 的走法)最关键的思维切入点。
二、核心思路:三分支分类讨论
官方题解给出的分类逻辑如下:
- 起点终点相同:无需移动,直接返回
0。 - 起点终点在同一条直线上:返回
1。包含四种情况:- 横坐标相同(同一行);
- 纵坐标相同(同一列);
- 起点终点连线的斜率为
-1(主对角线方向); - 起点终点连线的斜率为
1(副对角线方向)。
- 其余情况:走两步,返回
2。
其中两条对角线的判定用到了棋盘坐标(行号 + 列号)的经典数学性质:
- 主对角线方向(斜率 -1):满足
sr + sc == tr + tc(坐标和相等); - 副对角线方向(斜率 +1):满足
sr - sc == tr - tc(坐标差相等)。
结合前面"同行、同列"的两个判断,一条if语句即可覆盖全部"一步可达"的情形:
if sr == tr || sc == tc || sr+sc == tr+tc || sr-sc == tr-tc: return 1三、代码实现:Python / Java / C++ / Go 四语言对照
题解在同一套分类逻辑下提供了四种语言版本,便于不同技术栈的读者直接对照使用。
Python 3
class Solution: def minQueenMoves(self, source: list[int], target: list[int]) -> int: sr, sc = source tr, tc = target if sr == tr and sc == tc: return 0 if sr == tr or sc == tc or sr + sc == tr + tc or sr - sc == tr - tc: return 1 return 2Java
class Solution { public int minQueenMoves(int[] source, int[] target) { int sr = source[0]; int sc = source[1]; int tr = target[0]; int tc = target[1]; if (sr == tr && sc == tc) { return 0; } if (sr == tr || sc == tc || sr + sc == tr + tc || sr - sc == tr - tc) { return 1; } return 2; } }C++
class Solution { public: int minQueenMoves(vector<int>& source, vector<int>& target) { int sr = source[0], sc = source[1]; int tr = target[0], tc = target[1]; if (sr == tr && sc == tc) { return 0; } if (sr == tr || sc == tc || sr + sc == tr + tc || sr - sc == tr - tc) { return 1; } return 2; } };Go
func minQueenMoves(source, target []int) int { sr, sc := source[0], source[1] tr, tc := target[0], target[1] if sr == tr && sc == tc { return 0 } if sr == tr || sc == tc || sr+sc == tr+tc || sr-sc == tr-tc { return 1 } return 2 }四种实现完全同构:先取起点的行sr、列sc与终点的行tr、列tc,依次完成三个分支的判断。全程只涉及int级的加减与比较,没有任何循环或搜索过程。
四、复杂度分析
- 时间复杂度:$\mathcal{O}(1)$。只执行常数次比较运算,与棋盘大小无关。
- 空间复杂度:$\mathcal{O}(1)$。仅使用少量局部变量,无额外分配。
这也是本题"思维题"属性的体现:答案结构极其简单(0/1/2),代码本身几乎没有优化的空间,难点完全在于对棋盘规则的归纳与分类。
五、仓库源码级验证:实现、测试数据与测试框架
在本仓库中,该题的解法和验证流程是完整的、可复现的,读者可以直接在本地跑通整个流程。
1. 核心实现文件
leetcode/biweekly/192/a/a.go 中保存的正是上文的 Go 实现(package main,函数minQueenMoves)。它与其他三语言版本保持完全一致的逻辑,可以作为标准答案参与本地评测。
2. 测试数据文件
leetcode/biweekly/192/a/a.txt 中预置了 3 组官方示例,恰好覆盖了全部三个分类分支:
| 输入(source → target) | 期望输出 | 覆盖的分支 |
|---|---|---|
[8,1]→[1,8] | 1 | 对角线一步可达(坐标和均为 9) |
[4,2]→[1,3] | 2 | 既不同行同列,也不在同一对角线 |
[1,1]→[1,1] | 0 | 起点与终点相同 |
文件格式为"每fNumIn + fNumOut行一组数据":每组先依次给出各输入参数的序列化结果,最后一行给出期望输出,组间以空行分隔。测试框架会按此约定自动切分用例。
3. 测试入口与自动化框架
leetcode/biweekly/192/a/a_test.go 是本仓库自动生成的测试入口,它调用测试工具包中的testutil.RunLeetCodeFuncWithFile(t, minQueenMoves, "a.txt", 0)完成用例注入。RunLeetCodeFuncWithFile的实现位于 leetcode/testutil/leetcode.go,其工作流程为:
- 读取测试文件内容,去除空行与首尾空白;
- 通过反射(
reflect.TypeOf)获取被测试函数的参数个数fNumIn与返回值个数fNumOut; - 按
fNumIn + fNumOut行为一组,把文件数据切分为一个个完整的测试用例; - 逐组调用函数执行并比对期望输出,任何一组不通过都会输出「【答案错误】+ Input」等详细定位信息。
targetCaseNum = 0表示执行文件中全部用例;若指定为正数,则只运行对应编号的单个用例,并在通过后继续跑完全部用例。这种"源码 + 测试数据 + 自动评测"的组织方式,让你新增用例时只需要往a.txt追加数据,无需改动任何 Go 代码。
运行验证命令(在仓库根目录下):
go test ./leetcode/biweekly/192/a/六、一类题的通法:棋盘"最短步数"的退化分类
本题与 4034. 象到达目标格子的最少移动步数(Bishop 问题)属于同一类"棋盘棋子最短步数"问题,共同的套路是:
- 先利用棋子走法规则求出步数上界(皇后最多 2 步,象最多 2 步),把答案域压缩成很小的集合;
- 再按可达性做分类讨论,把"能不能 1 步到达"转化为坐标关系(同行、同列、
sr+sc、sr-sc等); - 剩下的情况统一取上界,无需任何搜索算法。
区别仅在于棋子规则不同:皇后可横、竖、斜,象只能斜。因此 Bishop 问题的分类分支里去掉"同行、同列",但"两条对角线判定"与"最多两步"的框架完全一致。把这类题目总结进你的"棋盘思维"刷题清单,遇到变体时即可快速套用。
七、总结
「皇后最少移动步数」的核心结论一句话概括:同点 0 步,同行同列同对角线 1 步,其余 2 步。其价值在于训练"先找上界、再分类讨论"的思维习惯,而非算法本身。结合本仓库 a.go 的实现、a.txt 的用例与 leetcode.go 的自动化评测框架,你可以零成本地在本地复现完整验证流程,并把同思路迁移到象(Bishop)、车(Rook)等其他棋子的最短步数问题上。
- 科学计算
【免费下载链接】codeforces-go
算法竞赛模板库 by 灵茶山艾府 💭💡🎈
相关推荐
力扣双周赛 159 Q1 题解:奇偶交替的最小相邻交换次数——codeforces-go 仓库源码解析
力扣双周赛 159 Q1 题解:奇偶交替的最小相邻交换次数——codeforces go 仓库源码解析 导读 本文基于 codeforces go 仓库中 双周
科学计算力扣双周赛 152「设计电子表格」:哈希表模拟法详解——基于 codeforces-go 仓库的 Go 实现与测试验证
力扣双周赛 152「设计电子表格」:哈希表模拟法详解——基于 codeforces go 仓库的 Go 实现与测试验证 导读 本文以 codeforces go
科学计算codeforces-go 仓库实战解析:力扣双周赛 150 Q1「好数之和」的线性遍历解法与工程化测试
codeforces go 仓库实战解析:力扣双周赛 150 Q1「好数之和」的线性遍历解法与工程化测试 本篇技术指南以开源算法竞赛模板库 codeforces
科学计算
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考