译皇后问题–构造法原理与证明时间复杂度mobfc的技术博客

由于原文使用了“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

THE END
0.科研速递|构造式隐写构造式隐写是近年来学术界研究的热点,最近的研究表明,由秘密信息直接生成高质量的数字图像是可以实现的。本期介绍复旦大学多媒体智能安全实验室在ACM MM 2022上录用的两篇论文,采用不同的手段实现了两种构造式隐写方法。 生成式隐写网络 近年来,生成式隐写(generative steganography)成为了一个新兴的研究方向。相比于传统隐写jvzquC41eu4gwmfp0gjv0ls1h35128h464;7c=:6;380rjlg0jzn
1.有机化合物的表示方法一、有机化合物构造式的表示方法 分子中原子的连接次序和键合性质叫做构造,表示分子构造的化学式叫做构造式。 二、有机化合物立体结构的表示方法 1. 伞形式 从垂直于C-C键轴方向看,实线表示的键位于纸面上,实楔形线表示的键伸向纸面前方,虚楔形线表示的键伸向纸面后方(纸的背面)。 jvzquC41yy}/5?5fqe4dp8ftvkimg88433>83Bd;7::44<>90jznn
2.《建筑施工高处作业安全技术规范》JGJ801991第4.1.3条 攀登的用具,结构构造上必须牢固可靠。供人上下的踏板其使用荷载不应大于1100N.当梯面上有特殊作业,重量超过上述荷载时,应按实际情况加以验算。 第4.1.4条 移动式梯子,均应按现行的国家标准验收其质量。 第4.1.5条 梯脚底部应坚实,不得垫高使用。梯子的上端应有固定措施。立梯工作角度以75°±5°jvzquC41yy}/lrfpujk:;7hqo1nuou4422=048uc26914@783;724@524;7387mvon
3.Lua中的变量类型与语句学习总结Lua2.5. Table构造式 除了上述直接赋予{}创建空table以外,可以初始化其值,如day = {"S", "M", "T"},或者point = {x = 10, y = 20}(即point.x=10,point.y=20)。以上两种初始化方式可以混用,还可以用分号代替逗号,来将列表部分和记录部分明显地分隔开,如polyline = {color = "blue"; {x = 0, jvzquC41yy}/lk:30pku1jwvkerf1A;5::4ivv
4.C++Map和Set详解(上)构造一个 pair 对象(键值对): std::pair<int, int> p(10, 20); 利用make_pair 函数模板构造一个 pair 对象(键值对),通过传递给 make_pair 的参数隐式推导出来。 std::pair<int,int> p = std::make_pair(10,20); // 常用这种构造方式 jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1::37488
5.2018年一级建筑师《建筑设计》考点复习预制配置式钢筋混凝土楼板的类型(按构造方式及受力特点分) ①实心板:跨度在2.4m内,板厚跨度的1/30,60~80mm,板宽600~900mm ②槽形板:是一种梁板结合的预制构件,板厚25~30mm,肋高150~300mm,板宽600mm、900、1200,跨度3~7.5mm,当板长超过6m,每隔1000~1500mm增设槽肋(荷载由两侧的边肋来承担) jvzquC41yy}/qq6220ipo8pcqunj1ƒmwegpjcwjwunj1=92539/j}rn
6.干货厌氧处理器的发展及新技术的特点原理启动要素!升流式厌氧污泥床(UASB)是第二代废水厌氧生物处理反应器中典型的一种。由于在UASB反应器中能形成产甲烷活性高、沉降性能良好的颗粒污泥,因而UASB反应器具有很高的有机负荷,近10年来得到了最广泛的应用,目前约占全世界正在运行的厌氧反应器中总数的70%。 jvzq<84yyy4oppwjl0ipo8mvon5htnjpapkxu89:4;4ivvq
7.C++unorderedmap和unorderedset的介绍和使用unordered_set的构造方式 unordered_set的函数接口说明 unordered_multiset 4、map/set与unordered_map/unordered_set的区别 set/unordered_set的性能对比 1、unordered系列关联式容器 在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到O(logN) ,即最差情况下需要比较红黑树的高度次,当树中jvzquC41dnuh0lxfp0tfv8gkva€zz8ftvkimg8igvcomu86489<68>7