n皇后问题(回溯法)
2015-05-30 18:32
555 查看
回溯法求解n皇后问题Queue(皇后k摆放在k行x[k]列的位置)
算法如下
输入:皇后的个数n
输出:n皇后问题的所有可行解
1. 初始化解向量x
={-1}
2. K=0;
3. While(k>=0)
3.1 把皇后k摆放在下一列的位置,即x[k]++;
3.2 从x[k]开始依次考察每一列,如果皇后k摆放在x[k]位置不发生冲突,则转步骤3.3;否则x[k]++试探下一列;
3.3 若n个皇后已全部摆放,则输出当前解,sum++;
3.4 若尚有皇后没摆放,则k++;
3.5 若x[k]出界,则回溯,x[k]=-1, k--;
3.6 若x[k]出界,且k==0,已经不能再回溯了,算法结束。
4. 退出循环,如果sum==0,则说明n皇后无解。
算法如下
输入:皇后的个数n
输出:n皇后问题的所有可行解
1. 初始化解向量x
={-1}
2. K=0;
3. While(k>=0)
3.1 把皇后k摆放在下一列的位置,即x[k]++;
3.2 从x[k]开始依次考察每一列,如果皇后k摆放在x[k]位置不发生冲突,则转步骤3.3;否则x[k]++试探下一列;
3.3 若n个皇后已全部摆放,则输出当前解,sum++;
3.4 若尚有皇后没摆放,则k++;
3.5 若x[k]出界,则回溯,x[k]=-1, k--;
3.6 若x[k]出界,且k==0,已经不能再回溯了,算法结束。
4. 退出循环,如果sum==0,则说明n皇后无解。
#include<iostream> #include<algorithm> #include<cmath> using namespace std; int x[100]={-1}; int place(int k) { for(int i=0;i<k;i++) { if(x[i]==x[k] || abs(i-k)==abs(x[i]-x[k))//考察皇后k放置在x[k]列是否发生冲突、 return 1;//违反约束条件 } return 0; } void Queue(int n) { int sum=0; int k=0; while(k>=0) { x[k]++;//在下一列摆放皇后k while(x[k]<n&&place(k)==1)//发生冲突 x[k]++;//皇后k试探下一列 if(x[k]<n && k==n-1)//得到一个解输出 { sum++; for(int i=0;i<n;i++) cout<<x[i]+1<<" "; cout<<endl; } if(x[k]<n&&k<n-1)//尚有皇后未摆放 k=k+1;//准备摆放下一个皇后 else { x[k--]=-1;//重制x[k],回溯,重新摆放皇后k } if(x[k]==n&&k==0)//已经不能再回溯了,算法结束 break; } if(sum==0) cout<<"无解"<<endl; } int main() { int n; cout<<"输入n: "; cin>>n; Queue(n); return 0; }
相关文章推荐
- JAVA和JVM运行原理揭秘
- Android 开发服务类 03_ServletForGETMethod
- 二分查找-Java版
- Hql带参数查询
- 使用Spring 3的@value简化配置文件的读取 (转)
- CentOS 7下Android NDK后缀为bin的文件处理
- Android开源框架--ViewPagerIndicator的使用
- 二叉树的镜像
- 博客增加二维码功能
- 自己工作的总结与前景
- ZOJ - 3690 Choosing number 矩阵快速幂
- Java_Socket简单通信
- Chapter 4-5
- android linker (1) —— __linker_init()
- XenServer 6.5实战系列之十一:Install Update For XenServer 6.5
- 使用url_helper简化Python中Django框架的url配置教程
- 查看mysql表结构和表创建语句的方法
- poj-1113
- 读浅墨博客 十一 笔记(2)代码
- 【移动开发者沙龙 北京站】第一期 移动应用性能优化笔记 火热报名中