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


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

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

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

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

    O(nm)

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

    Ω(nm)

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

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

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

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


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

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

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

    a=max(|x|,|y|),b=min(|x|,|y|)

    于是总有:

    ab0

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

    D(a,b)={3,(a,b)=(1,0)4,(a,b)=(2,2)d,其他情况

    其中先计算:

    d0=max(a2,a+b3)

    再按照奇偶性修正:

    d={d0,d0a+b(mod2)d0+1,d0a+b(mod2)

    例如:

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

    这个公式中的三个限制

    马的一步位移为:

    (±1,±2),(±2,±1)

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

    da2

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

    da+b3

    所以:

    dmax(a2,a+b3)

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

    (±1)+(±2)1(mod2)

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

    dx+ya+b(mod2)

    所以,当 d0a+b 奇偶性不同时,还需要再加一步。

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

    例如:

    (1,0)=(1,2)+(2,1)+(2,1)

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


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

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

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

    例如,在无限棋盘上:

    (1,1)(3,0)(2,2)

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

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

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

    0 3 2
    3 1 1
    2 1 4

    因此:

    无限棋盘上的最短距离有限棋盘上的最短距离

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


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

    没有。

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

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

    Z2

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

    (±1,±2),(±2,±1)

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

    H=(±1,±2),(±2,±1)

    只需证明:

    (1,0)H,(0,1)H

    因为 (1,0)(0,1) 生成整个 Z2

    首先:

    (1,2)+(2,1)+(2,1)=(1,0)

    所以:

    (1,0)H

    对应路径为:

    (0,0)(1,2)(3,1)(1,0)

    其次:

    (2,1)+(1,2)+(1,2)=(0,1)

    所以:

    (0,1)H

    对应路径为:

    (0,0)(2,1)(1,3)(0,1)

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

    (x,y)=x(1,0)+y(0,1)H

    因此:

    H=Z2

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


    四、尝试黑白染色

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

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

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

    即:

    dΔx+Δy(mod2)

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

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

    (0,0)(1,2)(3,1)(1,0)

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


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

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

    1mn

    结论为:

    m×n 的马步图连通(m,n)=(1,1),或 m3 且 (m,n)(3,3)

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

    1×n,2×n,3×3

    下面分别证明。


    六、1×n 棋盘不连通

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

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

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

    1×n (n>1) 不连通


    七、2×n 棋盘不连通

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

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

    Δ=±1,Δ=±2

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

    jj±2

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

    1 2 3 4 5 6

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

    因此:

    2×n 不连通

    这里的不变量是:

    列编号模 2 的余数


    八、3×3 棋盘不连通

    考虑中心点 (2,2)

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

    (±1,±2)

    还是:

    (±2,±1)

    都会越界。

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

    孤立点

    因此:

    3×3 不连通


    九、3×4 棋盘连通

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

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

    按编号依次移动:

    12312

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

    (1,2)(2,1)

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

    所以:

    3×4 连通


    十、从 3×4 推广到所有 3×n

    假设 3×k 已经连通,其中:

    k4

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

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

    (1,k+1)(3,k)

    (2,k+1)(1,k1)

    (3,k+1)(1,k)

    对应的坐标差分别为:

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

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

    由数学归纳法:

    3×n(n4) 全部连通


    十一、继续增加行数

    假设 k×n 已经连通,其中:

    k3,n4

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

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

    • jn2,则它与 (k,j+2) 相连;
    • jn1,则它与 (k,j2) 相连。

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

    (1,2)

    n4 保证所选旧格子始终存在。

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

    由归纳法:

    m3, n4 时,m×n 棋盘连通

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

    m×n 的马步图连通(m,n)=(1,1),或 m3 且 (m,n)(3,3)

    其中默认:

    mn


    十二、结论

    对于原题:

    有限棋盘上输出全部最短距离:使用 BFS,复杂度为 O(nm)

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

    存在 O(1) 公式

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

    马步向量生成 Z2,因此任意格点均可达

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

    除 1×n (n>1)2×n3×3 外,其余矩形棋盘均连通


    __EOF__

  • 本文作者: 高橋さくよ
  • 本文链接: https://www.cnblogs.com/mornhus-xsylf-123/p/20205007
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    Java Double valueOf(double d)方法具有什么功能呢?
    国产手机品牌抛弃的低端用户,为山寨机提供了复仇的机会
    数据库(一)
    php练习06
    万行代码计划A,Code Shit Mountain, Enlarging
    GraphQL & Go,graphql基本知识,go-graphql使用
    使用 TensorFlow.js 在浏览器中进行自定义对象检测
    Android焦点机制结合WMS
    从零开始搭建个人网站①
    推荐一个.Ner Core开发的配置中心开源项目
  • 原文地址:https://www.cnblogs.com/mornhus-xsylf-123/p/20205007