N皇后问题(回溯算法解法)
来源:互联网 发布:compareto java用法 编辑:程序博客网 时间:2024/05/29 00:33
N皇后问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3464 Accepted Submission(s): 1599
Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
8
Sample Output
92
由于棋盘的每列只有一个皇后,所i可以用一维向量A(a1,a2,a3……an)来表示第i列皇后所在的行a[i],即解空间的每个结点都有n个儿子,因此解空间大小为n^n,这是一颗子集树。
约束条件是斜率和行号都不可以相等。
回溯算法解题思路:
1.针对给定的问题,定义问题的解空间(子集树还是排列树)
2.确定易于搜索的解空间结构
3.以深度优先的方法搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索。
#include <cstdio>#include <iostream> #include <cmath>using namespace std;#define NUM 20int n;int x[NUM]; int sum; inline bool Place(int t) { int i; for (i=1; i<t; i++) if ((abs(t-i) == abs(x[i]-x[t])) || (x[i] == x[t])) //斜率相等或者行号相等 return false; return true; } void Backtrack(int t) { int i;if (t>n) {sum++;}elsefor (i=1; i<=n; i++) {x[t] = i;if (Place(t)) Backtrack(t+1);}} int main() { while (cin>>n){sum = 0;Backtrack(1);printf("%d\n", sum);}return 0; }
阅读全文
0 0
- N皇后问题(回溯算法解法)
- N皇后问题回溯解法
- N皇后问题的回溯解法
- 回溯算法n皇后问题
- 【算法分析】回溯法解八皇后问题(n皇后问题)
- N皇后问题(回溯)
- N皇后问题(回溯)
- n皇后问题(回溯)
- N皇后问题的一般解法--回溯法
- n皇后问题递归算法(回溯法)
- hdu 2553 N皇后问题(回溯算法)
- 求 N 皇后问题回溯算法
- n皇后问题——回溯算法
- 回溯算法之 N皇后问题
- 回溯算法之N皇后问题
- 回溯算法—n皇后问题
- 求 N 皇后问题回溯算法
- N皇后问题——回溯算法
- BZOJ1529 ska Piggy banks [并查集]
- 欢迎使用CSDN-markdown编辑器
- 阿里云Ecs安装的mysql远程连接报错10060
- mysql中对建好的表中添加一列
- UVA 11987 并查集(虚拟节点)
- N皇后问题(回溯算法解法)
- Java 面向对象
- JFinal 验证码绘制
- bzoj1096[ZJOI2007]仓库建设 斜率优化dp
- Android 使用代码实现一个选词(拖拽)填空题
- jenkins环境搭建
- 用axios发送请求,全局拦截请求,获取到错误
- mybatis-generator 代码自动生成工具
- 小米4c,5s 红米note4x 刷 Lineage OS