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

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

群友在讨论 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{ 外,其余矩形棋盘均连通} } \\