八皇后详解

来源:互联网 发布:sql 2000 备份 编辑:程序博客网 时间:2024/04/25 18:31

【历史】

八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果,事实上就是有92种解法。
 

【问题】

初始状态下在一个8×8国际象棋盘上没有任何棋子(皇后),然后顺序在第1行、第2行、...、第8行上布放棋子(皇后)。在每一行中有8个可选择位置,但在任一时刻,棋盘的合法布局都必须满足皇后间不会出现相互“攻击”的现象,即任何两个棋子不得放在棋盘上的同一行、或者同一列、或者同一斜线上。试编写一个递归算法,求解并输出此问题的所有合法布局。

【求解】

网上有很多种解,有c、delphi、java甚至python的,实质是一样的。

性能也有不一样的,有一个据说是史上最快的解,又是&又是|的,挺乱,学者可能用,工程不能用:没法读。

解题思路也有不一样的,经典的正确解应该是回溯+剪枝的做法,还有其他的方法吗?穷举貌似比较笨了。

 

【答案】

四皇后的解为2个;
五皇后的解为10个;
八皇后,共2057个节点需要遍历,解为92个,但是除去对称的、本质不同的之外,只有12种。

 

【代码】

本博客有一个c语言版本的代码,清晰并且正确:http://blog.csdn.net/sandyzhs/archive/2008/11/27/3390022.aspx

从前还写了一个从排列组合修改的八皇后做法,但是得到了312个解,不知道是哪里出了问题。

原创粉丝点击