八皇后问题
2015-08-11 19:37
113 查看
先来一张图
![](http://pic.baike.soso.com/p/20140702/20140702135646-295333029.jpg)
对于八皇后的求解可采用深搜+回溯算法,从上至下依次在每一行放置皇后,进行搜索,若在某一行的任意一列放置皇后均不能满足要求,则不再向下搜索,而进行回溯,回溯至有其他列可放置皇后的一行,再向下搜索,直到搜索至最后一行,找到可行解,输出。
具体代码如下所示
关于n皇后的解的个数(8皇后是92个解):
![](http://pic.baike.soso.com/p/20140702/20140702135646-295333029.jpg)
什么是八皇后问题呢? 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题。
对于八皇后的求解可采用深搜+回溯算法,从上至下依次在每一行放置皇后,进行搜索,若在某一行的任意一列放置皇后均不能满足要求,则不再向下搜索,而进行回溯,回溯至有其他列可放置皇后的一行,再向下搜索,直到搜索至最后一行,找到可行解,输出。
具体代码如下所示
[code] #include<iostream> #include <cstdio> #include <string.h> #include <math.h> using namespace std; int ans; int col[11]; void dfs(int row) { if (row == 8) { ans++; return ; } for (int i = 0; i < 8; i++) { col[row] = i; bool flag = true; for (int j = 0; j < row; j++) { if (col[j] == col[row] || col[j] + j == col[row] + row || col[j] - j == col[row] - row) { flag = false; break; } } if (flag) { dfs(row + 1); } } } int main() { ans = 0; dfs(0); cout << ans << endl; return 0; }
关于n皇后的解的个数(8皇后是92个解):
n a(n) 1 1 2 0 3 0 4 2 5 10 6 4 7 40 8 92 9 352 10 724 11 2680 12 14200 13 73712 14 365596 15 2279184 16 14772512 17 95815104 18 666090624 19 4968057848 20 39029188884 21 314666222712 22 2691008701644 23 24233937684440 24 227514171973736 25 2207893435808352 26 22317699616364044
相关文章推荐
- Permutations
- JSP页面提交到Servlet
- AndroidImageSlider
- ProGuard Version5.2(4.2)Manual-->Usage
- Js获取当前日期时间及其它操作
- 《Java开发实战经典》第三章答案3.1
- LeetCode之Flatten Binary Tree to Linked List
- 快速排序
- OGG "Loading data from file to Replicat"table静态数据同步配置过程
- 第十四章 端口
- Hibernate的事务管理
- Android中的动画(待续)
- 【坑】html5中使用context.lineWidth设置线的宽度是1,然而输出的宽度是2的原因
- jQuery的遍历
- 高并发系统类型
- Codeforces Round #315 (Div. 2) (ABCD题解)
- Visible 绑定
- 通讯录系统(VS2010控制台程序)
- IntelliJ Idea 常用快捷键列表
- 再看海贼