☰
皇后到达目标格子的最少步数:力扣双周赛 192 Q1 分类讨论题解(含 codeforces-go 仓库源码与测试验证)
2026/10/8 1:53:19 网站建设 项目流程
  • 科学计算

【免费下载链接】codeforces-go

算法竞赛模板库 by 灵茶山艾府 💭💡🎈

项目地址:https://gitcode.com/GitHub_Trending/co/codeforces-go
点击查看免费下载

本篇文章基于 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 的走法)最关键的思维切入点。

二、核心思路:三分支分类讨论

官方题解给出的分类逻辑如下:

  1. 起点终点相同:无需移动,直接返回0。
  2. 起点终点在同一条直线上:返回1。包含四种情况:
    • 横坐标相同(同一行);
    • 纵坐标相同(同一列);
    • 起点终点连线的斜率为-1(主对角线方向);
    • 起点终点连线的斜率为1(副对角线方向)。
  3. 其余情况:走两步,返回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 2

Java

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,其工作流程为:

  1. 读取测试文件内容,去除空行与首尾空白;
  2. 通过反射(reflect.TypeOf)获取被测试函数的参数个数fNumIn与返回值个数fNumOut;
  3. 按fNumIn + fNumOut行为一组,把文件数据切分为一个个完整的测试用例;
  4. 逐组调用函数执行并比对期望输出,任何一组不通过都会输出「【答案错误】+ 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 灵茶山艾府 💭💡🎈

项目地址:https://gitcode.com/GitHub_Trending/co/codeforces-go
点击查看免费下载

相关推荐

上一篇:OpenCore Simplify:5分钟打造完美黑苹果的终极指南
下一篇:wxhelper微信逆向安全实施框架指南:完整风险控制与合规开发蓝图

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询