看sicp看到8皇后谜题, 突然兴致来了,尝试独立解决(scheme代码的好处在于,即使你瞟了眼答案, 也不会有任何收获, 除了知道那儿有一坨神秘的括号和英文字符外但Python代码就不同了),成功了,而且还是N皇后算法(把N个皇后放到N*N正方形方格中有多少种方法, N为自然数).

最简单的情况是, 给你一个1*N的矩形, 需要把1个皇后放进去, 有多少种放法? 显然, 有N种放法. 这就是递归的终点. 那么如何把N*N的正方形转化为这种最简单的情况呢?

把N*N正方格分为两个矩形, 一个是1*N矩形A1, 另一个是(N-1)*N矩形B1. 则矩形B1里面必定有且仅有N-1个皇后, 现在只需要考虑如何把最后一个皇后F放到矩形A1里面就可以了.

矩形A1的皇后F的坐标(x, y), 它不能和矩形B1里面的任何一个皇后的坐标(px, px) 在同一水平(x==px), 或在同一垂直(y==py), 或在同一斜线(py-y==px-x 或 py-y==x-px), 符合条件的(x,y)加上矩形B里面的N-1个皇后的坐标组, 就构成了一个解.

上面解决了一般情形,接下来,需要把问题向最简单的情况分解:

考虑矩形B1, 它可以类似地分为一个1*N矩形和(N-2)*N矩形B2, 矩形B2里面有N-2个皇后;

考虑矩形B2, 它可以类似地分为一个1*N矩形和(N-3)*N矩形B3, 矩形B3里面有N-3个皇后;

....

考虑矩形B(N-2), 它可以类似地分为一个1*N矩形和1*N矩形B(N-1), 矩形B(N-1)里面有1个皇后;

这样, 矩形B(N-1)就是我们要的最简单的情况了.

把N*N正方形方格抽象为一个平面直角坐标系, 且0<= x, y <=N-1.

把问题输入抽象为一个整数N, 输出抽象为一组坐标组. 例如当N=4时,有2个坐标组能满足条件,分别是(0, 1), (1, 3), (2, 0), (3, 2)和(0, 2), (1, 0), (2, 3), (3, 1).

def nqueen(n):
def recur(x):
if x==0:
for y in range(n):
yield ((0, y),)
else:
for sln in recur(x-1):
for y in range(n):
if all((y!=py and py-y!=px-x and py-y!=x-px) for px, py in sln):
yield sln + ((x, y),)
return recur(n-1) def visual(n, sln):
for y in range(n-1,-1,-1):
for x in range(n):
if (x, y) in sln:
print('* ',end='')
else:
print('0 ',end='')
print()
print() if __name__=='__main__':
n = 4
for sln in nqueen(n):
print(sln)
visual(n,sln)

结果:

>>>
((0, 1), (1, 3), (2, 0), (3, 2))
0 * 0 0
0 0 0 *
* 0 0 0
0 0 * 0 ((0, 2), (1, 0), (2, 3), (3, 1))
0 0 * 0
* 0 0 0
0 0 0 *
0 * 0 0

问题解出的那一刻, 心里还是有些小激动, 因为这说明自己运用递归解决看似复杂问题的能力在增强. 放到以前, 我肯定在各种分类讨论中迷失, 或者想着想着就因为诸如"这太难了,头脑已想爆"的感慨而放弃.

不过, 更奇特的是, 我尝试着把nqueen的基本情况再往前推一步(纯粹是基于一种感觉):

def nqueen(n):
def recur(x):
if x== -1:
yield ()
else:
for sln in recur(x-1):
for y in range(n):
if all((y!=py and py-y!=px-x and py-y!=x-px) for px, py in sln):
yield sln + ((x, y),)
return recur(n-1)

竟然完完全全没有问题!!

这一刻我对递归的神奇佩服的五体投地...

递归的神奇之处在于你会发现问题竟然解决了--解N皇后谜题有感的更多相关文章

  1. 数据结构(DataStructure)与算法(Algorithm)、STL应用

    catalogue . 引论 . 数据结构的概念 . 逻辑结构实例 2.1 堆栈 2.2 队列 2.3 树形结构 二叉树 . 物理结构实例 3.1 链表 单向线性链表 单向循环链表 双向线性链表 双向 ...

  2. 【web安全】第三弹:web攻防平台pentester安装及XSS部分答案解析

    web for pentester是国外安全研究者开发的的一款渗透测试平台,通过该平台你可以了解到常见的Web漏洞检测技术. 下载链接及文档说明: http://pentesterlab.com/ex ...

  3. 二叉树遍历,递归,栈,Morris

    一篇质量非常高的关于二叉树遍历的帖子,转帖自http://noalgo.info/832.html 二叉树遍历(递归.非递归.Morris遍历) 2015年01月06日 |  分类:数据结构 |  标 ...

  4. 二叉树之AVL树的平衡实现(递归与非递归)

    这篇文章用来复习AVL的平衡操作,分别会介绍其旋转操作的递归与非递归实现,但是最终带有插入示例的版本会以递归呈现. 下面这张图绘制了需要旋转操作的8种情况.(我要给做这张图的兄弟一个赞)后面会给出这八 ...

  5. ( 递归 )Fractal -- POJ -- 2083

    http://poj.org/problem?id=2083 Fractal Time Limit: 1000MS   Memory Limit: 30000K Total Submissions:  ...

  6. 为什么你学不会递归?告别递归,谈谈我的一些经验 关于集合中一些常考的知识点总结 .net辗转java系列(一)视野 彻底理解cookie,session,token

    为什么你学不会递归?告别递归,谈谈我的一些经验   可能很多人在大一的时候,就已经接触了递归了,不过,我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是,给我的感觉就是,递归太神奇了! ...

  7. PHP 文件夹操作「复制、删除、查看大小」递归实现

    PHP虽然提供了 filesize.copy.unlink 等文件操作的函数,但是没有提供 dirsize.copydir.rmdirs 等文件夹操作的函数(rmdir也只能删除空目录).所以只能手动 ...

  8. Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法

    Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...

  9. 神奇的莫比乌斯带(mobius)

    1.禅师和青年之间的对话 2.制作一个莫比乌斯带 3.神奇的莫比乌斯带 4.对莫比乌斯带进行简单的数学建模 1.禅师和青年之间的对话 青年问禅师:“大师,我很爱我的女朋友,她也有很多优点,但是总有几个 ...

随机推荐

  1. bzoj 2436: [Noi2011]Noi嘉年华

    Description NOI2011 在吉林大学开始啦!为了迎接来自全国各地最优秀的信息学选手,吉林大学决定举办两场盛大的 NOI 嘉年华活动,分在两个不同的地点举办.每个嘉年华可能包含很多个活动, ...

  2. ●POJ 2774 Long Long Message

    题链: http://poj.org/problem?id=2774题解: 后缀自动机 使用后缀自动机匹配,思路如下: 即如果当前的x字符匹配失败了,就可以从当前已经匹配的串的后缀去继续匹配. 然后不 ...

  3. POJ 2289(多重匹配+二分)

    POJ 2289(多重匹配+二分) 把n个人,分到m个组中.题目给出每一个人可以被分到的那些组.要求分配完毕后,最大的那一个组的人数最小. 用二分查找来枚举. #include<iostream ...

  4. 51nod 1040 最大公约数之和(欧拉函数)

    1040 最大公约数之和 题目来源: rihkddd 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   给出一个n,求1-n这n个数,同n的最大公约数的和.比如: ...

  5. ●BZOJ 4710 [Jsoi2011]分特产

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4710 题解: 容斥,组合先看看这个方案数的计算:把 M 个相同的东西分给 N 个人,每个人可 ...

  6. 【AIM Tech Round 4 (Div. 2) D Prob】

    ·题目:D. Interactive LowerBound ·英文题,述大意:       有一个长度为n(n<=50000)的单链表,里面的元素是递增的.链表存储在一个数组里面,给出长度n.表 ...

  7. bzoj3944Sum

    3944: Sum Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5149  Solved: 1385[Submit][Status][Discuss ...

  8. bzoj 4010: [HNOI2015]菜肴制作

    Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号 ...

  9. BZOJ1187 [HNOI2007]神奇游乐园(插头dp)

    麻麻我会写插头dp了! 推荐陈丹琦论文:https://wenku.baidu.com/view/3e90d32b453610661ed9f4bd.html 破题调一年 #include <cs ...

  10. salesforce lightning零基础学习(二) lightning 知识简单介绍----lightning事件驱动模型

    看此篇博客前或者后,看一下trailhead可以加深印象以及理解的更好:https://trailhead.salesforce.com/modules/lex_dev_lc_basics 做过cla ...