n后问题————回溯法求解(递归与非递归)
来源:互联网 发布:数据库基础知识总结 编辑:程序博客网 时间:2024/06/05 02:02
N后问题要求在一个n*n格的棋盘上放置n个皇后,使得他们彼此不受攻击。按照国际象棋的规则,一个皇后可以攻击与之处在同一行或同一列或同一斜线上的其他任何棋子。因此,n后问题等价于要求在一个n*n的棋盘上放置n个皇后,使得任何2个皇后不能被放在同一行或同一列或同一斜线上。
用回溯法解n后问题时,可以用一颗完全n叉树来表示其解空间。用可行性约束函数Place可剪去不满足行、列和斜线约束的子树。*
#include<iostream>using namespace std;class Queen{ int n;//多少个皇后 int *x;//当前解 int sum;//总共有几种方法 bool Place(int k)//检查可行性 { for(int i = 0;i<k;++i) { if((x[i] == x[k]) || (abs(i-k) == abs(x[i]-x[k]))) { //不能放在同一行或同一列或同一斜线上 return false; } } return true; } void Backtrack(int k)//递归 { if(k == n) { sum+=1; for(int i = 0;i<n;++i) { for(int j = 0;j<n;++j) { if(x[j] == i) { cout<<"Q "; } else { cout<<"# "; } } cout<<endl; } cout<<endl; } else { for(int j = 0;j<n;++j) { x[k] = j; if(Place(k)) { Backtrack(k+1); } } } } /* void Backtrack() { x[0] = -1; int k = 0; while(k >= 0) { //x[k]表示皇后k放在棋盘的第k行的第x[k]列 x[k] +=1; while(x[k] < n && !Place(k)) x[k] +=1;//不符合条件列++ if(x[k] < n) { if(k == n-1) { sum++; for(int i = 0;i<n;++i) { for(int j = 0;j<n;++j) { if(x[j] ==i) { cout<<"Q ";//皇后放置的位置 }else { cout<<"# "; } } cout<<endl; } cout<<endl; }else { k++; x[k] = -1; } } else { --k; } } } */public: friend int nQueen(int n);};int nQueen(int n)//对Queen的成员变量初始化{ Queen Q; Q.n = n; Q.sum = 0; Q.x = new int[n]; for(int i = 0;i<n;++i) Q.x[i] = 0; Q.Backtrack(); delete []Q.x; return Q.sum;}void main(){ int n; int sum = 0; cin>>n; sum = nQueen(n); cout<<sum<<endl;}
//4个皇后总共2种解法,Q为皇后放置的位置
阅读全文
0 0
- n后问题————回溯法求解(递归与非递归)
- 回溯法解决N皇后问题——递归与非递归求解
- 回溯法求解n皇后问题——递归实现
- 非递归求解N皇后问题(回溯法)
- 八皇后问题(递归、非递归——回溯)
- N后问题——回溯法求解
- N 皇后问题 —— 递归求解
- 非递归回溯算法求解n-皇后问题
- 数据结构与算法中的“递归”——用回溯法求解8皇后问题
- 求{1,2,3}的子集————回溯法(递归与非递归)
- N皇后问题的非递归回溯和递归回溯
- 递归回溯法求解N皇后
- 深度优先—递归方法 求解n皇后问题
- 迷宫问题递归与非递归求解
- n皇后问题【非递归回溯】
- N皇后问题非递归求解
- 回溯法求解 “n 皇后 问题”——Java 实现
- 回溯法——求解N皇后问题
- QNX system architecture 6
- webpack 2.0
- Hbase对数据表的增删改查和对数据的增删改查
- Kafka 消息偏移量的维护
- ACM暑假训练codeforces A. Arcade Game D. Frozen Rivers(康托展开式,spfa)
- n后问题————回溯法求解(递归与非递归)
- mysql replace into 遇上主键自增
- use python to sendmail
- nutch2二次开发笔记
- JAVA函数实现任意给定一组数, 找出任意数相加等于某数或者在一个范围
- 正则中出现多个贪婪模式
- 外观模式 | Facade Pattern
- 设计模式之单例模式
- QNX system architecture 11