由于原文使用了“m皇后”进行描述,所以本文从现在开始也使用“m皇后”进行描述。我这里就不调整为大多数人习惯的“n皇后”了,避免某些数学公式参数混淆。
*【写在前面】*
这是现在网上流传的一套关于M皇后问题的构造法公式,但是这套公式是怎么得来的,却鲜有人知。而文本会详细阐述这套公式的推导过程:
该论文已被美国数学协会 Mathematical Association of America 公开,具体期数为 Vol.42, No.2 (Mar., 1969), pp. 66-72。
该文献可从以下途径购买:
该文献的英文原文链接:
M皇后问题: 在M×M格的国际象棋上摆放M个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。
根据场景,又有三种衍生问题:
问题① 属于 禁位排列 问题,目前是存在通项公式直接求解的。
问题② 属于 搜索 问题,在网上也有多种解法,主流是 回溯法(另有衍生的位运算变种算法),但不管如何优化,回溯法都有一个致命的问题:M值不能过大(一般M=30已是极限)。
问题③ 属于 问题② 的子集,因此很多人的切入点依然是回溯法,也有启发式算法的解法:如遗传算法、还有刘汝佳在《算法艺术与信息学竞赛》提出的启发式修补算法。启发式算法在M<10000左右都是可解的,但是因为启发式算法均存在随机性,收敛速度视不同的收敛因子而变化(我看过某篇论文称启发式算法在M=10000时的耗时等价于回溯法M=30的耗时)。
① 原文写得有点艰涩,有些中间步骤是跳过了。我就加上自己的理解做了意译,并补上了跳过的步骤和图示,但是核心的推导思路和步骤不会修改。
② 原文首先给出了3个构造式(其实就是m皇后问题的通解式),然后以此为结论展开了一系列的推导证明这3个构造式是正确的。但是这3个构造式真正是怎么得来,原作者并没有说,估计是原作者做了大量的演绎、从m皇后的特解找到了潜在规则所总结出来的通解。
m皇后问题最初是由Gauss(高斯)提出的,该问题描述如下:
是否有可能在一个m×m的国际棋盘上放置m个皇后使得她们无法互相攻击?(注:皇后是国际象棋中的一种棋子,她可以对横、竖、斜三个方向的棋子发起攻击)
这是一个有趣的问题,我们可以将其约束到一个 数学模型 进行描述:
把棋盘定义为一个m×m的方格矩阵,那么对于任意方格可以使用有序对 (i, j) 以表示其行列坐标,其中 1 ≤ i ≤ m 表示该方格的行编号, 1 ≤ j ≤ m 表示该方格的列编号。
同时我们再为每个方格定义一组对角编号:
令自左上到右下方向为主对角线,对于主对角线上的方格 (i, j) ,显然有:
m - j + i = MAJOR_CONSTANT —— 译者注:这个公式对后续推导起到重要作用
其中 MAJOR_CONSTANT 称之为主对角常数,显然有 1 ≤ MAJOR_CONSTANT ≤ m ,将其定义为方格 (i, j) 的主对角编号。
进一步地,令自右上到左下方向为次对角线,对于次对角线上的方格 (i, j) ,显然有:
i + j - 1 = MINOR_CONSTANT —— 译者注:这个公式对后续推导起到重要作用
其中 MINOR_CONSTANT 称之为次对角常数,显然有 1 ≤ MINOR_CONSTANT ≤ m ,将其定义为方格 (i, j) 的次对角编号。
至此,m皇后问题的解模型可以定义为如下:
放置m个皇后到一个m×m的方格矩阵,使得皇后们的所在的方格同时满足下面所有条件:
这个模型足以解决所有m皇后问题(但仅适用于 m ≥ 4 的情况,因为 m = 2、3 时无解,m = 1 的解就不需要讨论了) —— 译者注:这个大前提条件会在最后进行论证
由于通解公式相对复杂,为了便于说明,此处不从过程推导出结论,而是反其道而行之:先给出结论的通解公式(且不考虑公式是怎么推演出来的),再证明之。
m皇后问题的解的共由3个构造式组成。
令 m = 2n,其中 n = 2, 3, 4, ...
构造式A仅适用于m是偶数的情况,它由两个子公式组成:
令 m = 2n,其中 n = 2, 3, 4, ...
构造式B同样仅适用于m是偶数的情况,它同样由两个子公式组成:
构造式C是构造式A或B的扩展推导式,仅适用于m+1是奇数的情况:
当已使用构造式A或B求得一个m×m的皇后问题的解时,若同时增加第 m+1 行和第 m+1 列,那么第 m+1 个皇后应放置在坐标为 (m+1, m+1) 的方格。
要证明构造式是成立的,只需要证明每个构造式导出的皇后位置均满足:
令 m = 2n,其中 n = 2, 3, 4, ...(即m≥4且是偶数):
构造式含义:若把棋盘在横中轴线切开,很明显解集是呈中心旋转对称的,其中上半部分对应PA-1的解集,下半部分对应PA-2的解集:
定理A
对于m皇后问题,当 n != 3λ + 1 (其中 λ = 0, 1, 2, ... )时,则必定可以使用【构造式A】求解。
① 行列编号的唯一性证明:
② 主对角编号的唯一性证明:
受 k、l 的取值范围影响,显然是不可能的,主对角编号的唯一性得证。
③ 次对角编号的唯一性证明:
由此可知当 n != 3λ + 1(λ = 0, 1, 2, ...)时,次对角编号是唯一的。
综上①②③,定理A得证 。
令 m = 2n,其中 n = 2, 3, 4, ...(即 m ≥ 4 且是偶数):
为了便于说明,对 PB-1 和 PB-2 的对m取mod运算做一下等价处理:
构造式含义:若把棋盘在横中轴线切开,很明显解集是呈中心旋转对称的,其中上半部分对应 PB-1 的解集,下半部分对应 PB-2 的解集。同时根据列编号 mod m 部分的取值( ≥m 或 <m ),PB-1 与 PB-2 的解集又分别拆分成两个分段函数子集:
定理B
对于m皇后问题,当 n != 3λ (其中 λ = 1, 2, 3, ... )时,则必定可以使用【构造式B】求解。
① 行列编号的唯一性证明:
明显地:
② 主对角编号的唯一性证明:
而 n = 3 不在定理B的前提条件 n != 3λ(λ = 1, 2, 3, ...)范围内,可以直接排除。
因此 n > 3(否则 k' 与 l' 不能存在),所以不存在 n = 2 或 n = 3 取值的可能性,亦即(2)(3)实际均不成立。
综上,(1)(2)(3)(4)(5)(6)均不成立,主对角编号的唯一性得证。
③ 次对角编号的唯一性证明:
由此可知,当 n != 3λ(λ = 1, 2, 3, ...)时,(1)(2)(3)(4)(5)(6)均不成立,次对角编号的唯一性得证。
综上①②③,定理B得证 。
我们定义棋盘上由方格 (1, 1)、 (2, 2)、 (3, 3)、 ...、 (m, m) 连线所得的对角线为标准对角线,亦即标准对角线的行列编号必有 i == j 。
在证明构造式C之前,首先需要证明两条引理:
① 【引理A】的证明:
k = 0 与取值范围 k = 1, 2, 3, ..., n 矛盾,l = 0 与取值范围 l = 1, 2, 3, ..., n 矛盾,因此假设不成立,【引理A】得证。
② 【引理B】的证明:
由于 2n=m≥4 ⇒ n≥2,因此(1)(3)不成立,否则 k,l ≤ 0,与取值范围矛盾。
又由于(2)(4)的取值范围 k,l ≤ n,(2)(4)明显不成立。
因此假设不成立,【引理B】得证。
定理C
对于可使用【构造式A】或【构造式B】求解的m皇后问题,若同时增加第 m+1 行和第 m+1 列,使其延展为 m+1 皇后问题,那么这个 m+1 皇后问题也是可解的,且第 m+1 个皇后应放置在坐标为 (m+1, m+1) 的方格。
① 行列编号的唯一性证明:
由于【定理C】是从【定理A】或【定理B】上扩展的,且【定理A】与【定理B】的所有皇后的行列编号唯一性已得到证明,而【定理C】的第 m+1 行与第 m+1 列是新增的,那么第 m+1 个皇后的行列编号也必定是唯一的,因此所有皇后的行列编号必定也是唯一的。
② 主对角编号的唯一性证明:
由于第 m+1 个皇后的主对角线与标准对角线是重合的,而通过【引理A】与【引理B】可知在m×m范围内的标准对角线上不存在任何皇后,换言之标准对角线上只有第 m+1 个皇后,所以主对角线编号是唯一的。
③ 次对角编号的唯一性证明:
对于第 m+1 条次对角线,上面只有 (m+1, m+1) 一个方格,显然次对角线编号是唯一的。
上述所有的证明,都是基于一开始给出的大前提条件:
亦即m皇后问题( m≥4 且 m是偶数)可通过【构造式A】或【构造式B】求解,而 m+1 皇后问题( m+1≥5 且 m是奇数)则可通过【构造式C】求解。
至于为什么 m=1、 m=2 或 m=3 时并不适用于构造式A、B、C就是这里要讨论的。
首先当 m=1 时,虽然是有明确的唯一解,但并不存在 m=2n 的形式。而n作为三个构造式的重要变量,既然一开始就不存在n值,构造式A、B、C也就无从谈起了。
那么需要证明的,就是为什么 m=2 与 m=3 也不可取?
证明:
不难发现,(2)中 m=2 是在 m<4 范围内没有被约束条件限制的特例。
但当 m=2 时 n=1,不妨把 n=1 代入 PB-1 与 PB-2,取值范围均矛盾,无法计算列坐标编号。
因此对于【定理A】与【定理B】而言,m=2 都是不可解的,从而导致 m=3 也不可用【定理C】求解。
证毕(事实上,通过画图可以明显发现 m=2、 m=3 是无解的)。
在原作者提出的三个构造式A、B、C中,均使用 (i, j) 的二维坐标形式标记每个皇后的位置,从数学角度上更易于表达作者的思想,但是不便于编程使用。
为此译者在这里补充针对构造式A、B、C的转换公式,使用一维坐标形式标记每个皇后位置,以配合编程使用(其实这就是目前网上普遍流传的m皇后问题构造式)。
一维坐标的标记方式为:从第1行开始,依次写出m个数字,分别代表每行的皇后列坐标。亦即行坐标为数序(索引/下标),列坐标为数值。
如序列 [5, 3, 1, 6, 8, 2, 4, 7] 等价于 (1,5), (2,3), (3,1), (4,6), (5,8), (6,2), (7,4), (8,7)
约束条件:n != 3λ + 1(其中λ = 0, 1, 2, ...)
当m为偶数时:
当m为奇数时:
约束条件:不满足构造式A约束条件的,都可使用构造式B求解。
当m为偶数时, n=m/2:
若n为偶数:
若n为奇数:
当m为奇数时, n=(m-1)/2:
若n为偶数:
若n为奇数:
The desire of his soul is the prophecy of his fate你灵魂的欲望,是你命运的先知。
一、\r、\n、以及\r\n的区别\r :将当前位置移到本行开头。又叫回车,对应键盘上的return键\n:将当前位置移到下一行开头。又叫换行,newline。这时候可能就有人陷入了思考中,在文本中回车不就相当于换行了吗?换行不就相当于到了下一行了吗?其实按道理说这样理解是没有问题的,但是在不同的操作系统中,换行是由不同的方式来表示的。Linux中\n表示回车并换行;Window
ASE40N02-ASEMI中低压N沟道MOS管ASE40N02
n mod 6 != 3时,有一个解为: 2,4,6,8,...,n,1,3,5,7,...,n-1 (n为偶数) 2,4,6,8,...,n-1,1,3,5,
题目描述:在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。你的任务是,对于给定的N,求出有多少种合法的放置方法。该算法有诸多解法,解的范围有很大区别。此处仅给出递归的解法,其他部分解法将在以后说明。1 . 代码:#include<iostream>using namespace std;const int N =
问题描述给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。解决方案思路分析先讨论n个皇后放在n*n的棋盘中,且不能同行、同列、同对角线的问题,那么第一个条件就是这些皇后的位置需要在不同行,即每行一个
N皇后问题 •问题描述 在。 •算法分析 只考虑第i个皇后放置在第i行的哪一列,所以在放置第i
本文介绍了Flask框架中模板渲染的基本概念和使用方法。主要内容包括:1)模板和渲染的定义,Flask使用Jinja2作为模板引擎;2)Jinja2的基本语法,包括变量标记、语句标记和注释的三种定界符;3)通过实例演示了如何创建模板文件夹、编写HTML模板、生成虚拟数据并使用render_template函数渲染页面。文章还推荐了相关工具扩展,如Jinja2 Enhance插件提升开发效率。
本文介绍了五个Java编程解题案例,涵盖字符串处理、贪心算法、动态博弈等知识点每个案例都包含解题思路、完整代码和涉及的知识点
TTL即Time To Live,是IPV4报头的一个字段,从字面意思来看是指IP数据报生存的时间,实际上是指IP数据报在计算机网络上可以转发的最大跳数。TTL字段由发送方设置,最大值为255,推荐值为64,在从从源到目的的整个转发路径上,IP数据报每经过一个路由器,路由器就会将TTL字段值减1并转发出去。如果还未到达源时TTL就减至0,路由器就会丢弃该数据报并向发送方发送一个 ICMP
try:finally:ABenter -> using resource -> value_error handled -> exit -> (程序因未捕获的 ValueError 异常而终止)Center -> using resource -> exit -> (程序因未捕获的 ValueError 异常而终止)Denter -> using resource -> done -> (程序因未捕获的 ValueError 异常而终止)
一、应用通信架构设计1.1 需求场景用户在订单系统完成下单后,订单系统无需直接调用物流系统接口,而是通过 RabbitMQ 发送“下单成功”消息;物流系统监听 RabbitMQ 队列,接收消息后触发发货流程,实现“订单-物流”两个独立应用的异步通信。1.2 架构图角色划分:订单系统作为生产者,负责发送消息;物流系统作为消费者,负责接收并处理消息;核心组件:使用 RabbitMQ 的简单队列(ord