当前位置: 首页 > news >正文

马能否走遍棋盘的可达性证明

马能否走遍棋盘的可达性证明

群友在讨论 P1443 马的遍历 这道题。很明显是广搜。

题目是在一个 \(n\times m\) 的棋盘上给定马的起点,求它到每一个格子的最短步数;无法到达的位置输出 \(-1\)

把每个格子看成一个顶点,每一次合法马步看成一条边,那么题目就是无权图上的单源最短路。直接从起点做 BFS 即可,时间复杂度为:

\[O(nm) \]

而题目本身要求输出 \(nm\) 个答案,仅输出就至少需要:

\[\Omega(nm) \]

所以对于原题,BFS 已经达到最优复杂度量级。

不过,继续考虑两个问题:

  1. 如果只询问到某一个点的距离,是否存在直接公式?
  2. 是否存在马永远到不了的点?

显然这两个问题必须区分有限棋盘与无限棋盘。


一、无限棋盘上的单点最短距离公式

将起点平移到原点 \((0,0)\),目标点记为 \((x,y)\)

由于马步关于坐标轴和直线 \(y=x\) 对称,只需令:

\[a=\max(|x|,|y|),\qquad b=\min(|x|,|y|) \]

于是总有:

\[a\ge b\ge 0 \]

在无限棋盘上,最短步数为:

\[D(a,b)= \begin{cases} 3, & (a,b)=(1,0) \\[6pt] 4, & (a,b)=(2,2) \\[6pt] d, & \text{其他情况} \end{cases} \]

其中先计算:

\[d_0= \max\left( \left\lceil\frac{a}{2}\right\rceil, \left\lceil\frac{a+b}{3}\right\rceil \right) \]

再按照奇偶性修正:

\[d= \begin{cases} d_0, & d_0\equiv a+b\pmod 2 \\[6pt] d_0+1, & d_0\not\equiv a+b\pmod 2 \end{cases} \]

例如:

目标位移 最少步数
\((1,2)\) \(1\)
\((1,1)\) \(2\)
\((1,0)\) \(3\)
\((2,2)\) \(4\)
\((5,5)\) \(4\)

这个公式中的三个限制

马的一步位移为:

\[(\pm1,\pm2),\qquad(\pm2,\pm1) \]

首先,较大的坐标差每一步最多减少 \(2\),因此:

\[d\ge \left\lceil\frac{a}{2}\right\rceil \]

其次,坐标绝对值之和每一步最多减少 \(3\),因此:

\[d\ge \left\lceil\frac{a+b}{3}\right\rceil \]

所以:

\[d\ge \max\left( \left\lceil\frac{a}{2}\right\rceil, \left\lceil\frac{a+b}{3}\right\rceil \right) \]

最后,马每走一步,坐标和的奇偶性都会翻转。因为一步中坐标和的变化量一定是奇数:

\[(\pm1)+(\pm2)\equiv1\pmod 2 \]

因此,若走 \(d\) 步到达 \((x,y)\),必须满足:

\[d\equiv x+y\equiv a+b\pmod 2 \]

所以,当 \(d_0\)\(a+b\) 奇偶性不同时,还需要再加一步。

两个特殊点 \((1,0)\)\((2,2)\) 属于距离过小造成的局部例外,需要单独处理。

例如:

\[(1,0)=(1,2)+(2,-1)+(-2,-1) \]

因此从原点到 \((1,0)\) 可以三步到达,但不可能更少。


二、为什么这个公式不能解决原题

上面的公式针对的是无限棋盘。

原题中的棋盘存在边界,而无限棋盘上的最短路径可能会暂时跳出矩形区域。

例如,在无限棋盘上:

\[(1,1)\rightarrow(3,0)\rightarrow(2,2) \]

所以从 \((1,1)\)\((2,2)\) 可以两步到达。

但在 \(3\times3\) 棋盘中,\((3,0)\) 已经越界,这条路径不合法。事实上,中心点 \((2,2)\) 没有任何合法马步与其他位置连接。

从左上角出发时,距离表为:

\(0\) \(3\) \(2\)
\(3\) \(-1\) \(1\)
\(2\) \(1\) \(4\)

因此:

\[\text{无限棋盘上的最短距离}\neq\text{有限棋盘上的最短距离} \]

有限棋盘中,边界会改变整张马步图的结构,所以原题仍应使用 BFS。


三、无限棋盘上有没有永远到不了的点

没有。

这个结论可以直接通过生成元证明。

把所有整数格点组成的集合视为加法群:

\[\mathbb Z^2 \]

马的一步能够产生的位移向量为:

\[(\pm1,\pm2),\qquad(\pm2,\pm1) \]

记这些向量生成的子群为:

\[H=\left\langle(\pm1,\pm2),(\pm2,\pm1)\right\rangle \]

只需证明:

\[(1,0)\in H,\qquad(0,1)\in H \]

因为 \((1,0)\)\((0,1)\) 生成整个 \(\mathbb Z^2\)

首先:

\[(1,2)+(2,-1)+(-2,-1)=(1,0) \]

所以:

\[(1,0)\in H \]

对应路径为:

\[(0,0)\rightarrow(1,2)\rightarrow(3,1)\rightarrow(1,0) \]

其次:

\[(2,1)+(-1,2)+(-1,-2)=(0,1) \]

所以:

\[(0,1)\in H \]

对应路径为:

\[(0,0)\rightarrow(2,1)\rightarrow(1,3)\rightarrow(0,1) \]

于是,对任意整数点 \((x,y)\),都有:

\[(x,y)=x(1,0)+y(0,1)\in H \]

因此:

\[H=\mathbb Z^2 \]

无限棋盘上,马可以到达任意整数格点。


四、尝试黑白染色

将棋盘按照 \(x+y\) 的奇偶性染成黑白两色。

马每走一步,\(x+y\) 的奇偶性都会翻转,因此格子颜色也会翻转。

所以,如果目标点与起点同色,则所需步数一定为偶数;如果目标点与起点异色,则所需步数一定为奇数。

即:

\[d\equiv \Delta x+\Delta y\pmod 2 \]

但是,这只能限制步数的奇偶性,不能证明某个点不可达。

例如,\((1,0)\) 与原点异色,所以它必须经过奇数步到达;而它确实可以在三步后到达:

\[(0,0)\rightarrow(1,2)\rightarrow(3,1)\rightarrow(1,0) \]

因此在无限棋盘上,染色法约束步数奇偶,但不产生不可达点。


五、有限矩形棋盘什么时候连通

考虑一个没有障碍物的 \(m\times n\) 矩形棋盘,不妨设:

\[1\le m\le n \]

结论为:

\[\boxed{ m\times n\text{ 的马步图连通} \iff (m,n)=(1,1) \text{,或 } m\ge3\text{ 且 }(m,n)\neq(3,3) } \]

换言之,除单格棋盘外,不连通的矩形棋盘只有:

\[1\times n,\qquad 2\times n,\qquad 3\times3 \]

下面分别证明。


六、\(1\times n\) 棋盘不连通

如果棋盘只有一行,马不存在任何合法移动。

因为马的一步至少需要跨越两行或三行,而棋盘中只有一行。

因此当 \(n>1\) 时,每个格子都是孤立点:

\[\boxed{1\times n\ (n>1)\text{ 不连通}} \]


七、\(2\times n\) 棋盘不连通

如果棋盘只有两行,马的一步不可能让行号变化 \(2\),否则会越界。

因此,合法移动只能满足:

\[\Delta\text{行}=\pm1,\qquad \Delta\text{列}=\pm2 \]

也就是说,列编号每次只能变化 \(2\)

\[j\rightarrow j\pm2 \]

于是列编号的奇偶性保持不变。

\(1\) \(2\) \(3\) \(4\) \(5\) \(6\)

从奇数列出发,永远到不了偶数列;从偶数列出发,永远到不了奇数列。

因此:

\[\boxed{2\times n\text{ 不连通}} \]

这里的不变量是:

\[\boxed{\text{列编号模 }2\text{ 的余数}} \]


八、\(3\times3\) 棋盘不连通

考虑中心点 \((2,2)\)

从中心点出发,马无论走:

\[(\pm1,\pm2) \]

还是:

\[(\pm2,\pm1) \]

都会越界。

所以中心点没有任何邻点。由于马步可逆,也没有任何其他点能够到达中心点。

\(\cdot\) \(\cdot\) \(\cdot\)
\(\cdot\) 孤立点 \(\cdot\)
\(\cdot\) \(\cdot\) \(\cdot\)

因此:

\[\boxed{3\times3\text{ 不连通}} \]


九、\(3\times4\) 棋盘连通

下面给出一条经过全部十二个格子的合法路径。表格中的数字表示访问顺序:

\(1\) \(4\) \(7\) \(10\)
\(8\) \(11\) \(2\) \(5\)
\(3\) \(6\) \(9\) \(12\)

按编号依次移动:

\[1\rightarrow2\rightarrow3\rightarrow\cdots\rightarrow12 \]

任意相邻两个编号所在位置的坐标差都为:

\[(1,2)\quad\text{或}\quad(2,1) \]

因此每一步都是合法马步。

所以:

\[\boxed{3\times4\text{ 连通}} \]


十、从 \(3\times4\) 推广到所有 \(3\times n\)

假设 \(3\times k\) 已经连通,其中:

\[k\ge4 \]

现在向右增加第 \(k+1\) 列。

新增的三个格子分别可以与旧棋盘中的格子通过一步马步相连:

\[(1,k+1)\leftrightarrow(3,k) \]

\[(2,k+1)\leftrightarrow(1,k-1) \]

\[(3,k+1)\leftrightarrow(1,k) \]

对应的坐标差分别为:

新增格子 旧棋盘中的邻点 坐标差
\((1,k+1)\) \((3,k)\) \((2,1)\)
\((2,k+1)\) \((1,k-1)\) \((1,2)\)
\((3,k+1)\) \((1,k)\) \((2,1)\)

所以新增一列中的每个格子都接入了原来的连通块。

由数学归纳法:

\[\boxed{3\times n\quad(n\ge4)\text{ 全部连通}} \]


十一、继续增加行数

假设 \(k\times n\) 已经连通,其中:

\[k\ge3,\qquad n\ge4 \]

现在向下增加第 \(k+1\) 行。

对于新增行中的任意格子 \((k+1,j)\)

  • \(j\le n-2\),则它与 \((k,j+2)\) 相连;
  • \(j\ge n-1\),则它与 \((k,j-2)\) 相连。

上述两种连接的坐标差均为:

\[(1,2) \]

\(n\ge4\) 保证所选旧格子始终存在。

所以新增行中的每个格子都会接入原连通块。

由归纳法:

\[\boxed{m\ge3,\ n\ge4\text{ 时,}m\times n\text{ 棋盘连通}} \]

结合前面的三个反例,得到完整分类:

\[\boxed{ m\times n\text{ 的马步图连通} \iff (m,n)=(1,1) \text{,或 } m\ge3\text{ 且 }(m,n)\neq(3,3) } \]

其中默认:

\[m\le n \]


十二、结论

对于原题:

\[\boxed{\text{有限棋盘上输出全部最短距离:使用 BFS,复杂度为 }O(nm)} \]

对于无限棋盘上的单点最短距离:

\[\boxed{\text{存在 }O(1)\text{ 公式}} \]

对于无限棋盘上的可达性:

\[\boxed{\text{马步向量生成 }\mathbb Z^2\text{,因此任意格点均可达}} \]

对于有限矩形棋盘的连通性:

\[\boxed{ \text{除 }1\times n\ (n>1)、2\times n、3\times3\text{ 外,其余矩形棋盘均连通} } \]

http://www.zskr.cn/news/1416062.html

相关文章:

  • Arduino线性霍尔磁力传感器模块应用指南:从原理到转速测量实战
  • 基于树莓派Pico的模块化教育机器人平台设计与实践
  • 为什么92%的Sora 2预告片被平台限流?深度溯源Meta/Adobe联合内容指纹协议,附3种合规性绕过验证路径
  • 干货合集:盘点2026年全网顶尖的的降AIGC平台
  • 告别论文焦虑:6款2026年优质AI论文网站深度横评
  • 3分钟找出Windows热键冲突元凶:Hotkey Detective让你重掌键盘控制权
  • Windows 11任务栏自定义终极指南:用Taskbar11解锁隐藏功能
  • 科创板新股长进光子首日涨1510%,早期投资者最高获567倍回报
  • 对比直接使用官方API与通过Taotoken接入的便捷性感受
  • 如何用淘宝淘金币自动化脚本每天节省20分钟:终极时间管理方案
  • Countly 25.03.45 发布:修复图表笔记、任务过滤等多项功能问题
  • Arduino Nano引脚焊接加固教程:从原理到实践解决连接松动
  • 陶瓷厂尾气监测数据上报到HJ212平台解决方案
  • 从麦克风到单片机:ADC采样保持电路(SHA)是如何决定你音频项目音质的?
  • 别再只盯着R²了!用Python的statsmodels库实战回归模型显著性检验(F检验与t检验)
  • 通过TaotokenCLI工具一键配置团队统一的AI开发环境
  • DRAM价格暴涨超200%,Meta开源缓存引擎CacheLib更新解成本难题
  • Honey Select 2终极补丁:如何5分钟完成游戏体验全面升级
  • 创业公司如何利用 Taotoken 控制多模型 API 成本与稳定性
  • CDS API 终极指南:5分钟掌握气候数据下载完整教程 [特殊字符]
  • DeepSeek App启动速度提升300%的7个秘密技巧:从冷启动到热更新全链路优化
  • 5分钟快速修复损坏视频:untrunc终极指南(免费无损修复MP4/MOV/M4V/3GP)
  • 对比使用Taotoken前后大模型API调用的月度账单变化
  • 老旧设备秒变高清通话,A-59P 模组 USB 免驱升级实战
  • 2026全功能PDF转换器推荐:转格式+压缩+合并一套搞定 - 时时资讯
  • Blender MMD插件完全指南:打通二次元与3D创作的桥梁
  • OpenClaw本地化部署优化:提升运行速度,解决卡顿、延迟问题
  • 别再只会重装!深入理解MathType与MT Extra字体的版本依赖与冲突根源
  • 私有化大模型选型必看:DeepSeek企业版vs Llama3-70B商用版,9项关键指标横向对比
  • Java程序员学习SpringBoot的最快方式都在这了!