算法分析与设计回溯法之n皇后问题
来源:互联网 发布:条数计算java 编辑:程序博客网 时间:2024/06/05 18:24
问题介绍:在n*n格的棋盘上放置彼此不受攻击的n个皇后。由于皇后可以攻击与之处于同一行或同一列或在同一斜线上的棋子。n皇后问题等价于在n*n的棋盘上放置n个皇后,任何两个皇后不放在同一列或同一行或同一斜线上。
分析:用n元组x[1:n]表示n皇后问题的解。其中,x[i]表示皇后i放在棋盘的第i行的第x[i]列。将n*n的棋盘看做二维方阵,其行号从上到下,列号从左到右依次编号1,2,3,4..n,从棋盘的左上角到右下角的主对角线及其平行线上,2个下标值的差值相等。同理,斜率为+1的每一条斜线上,2个下标值的和值相等。因此,若两个皇后放置的位置分别是(i,j)和(k,l),且i-j=k-l或i+j=k+l,则说明这两个皇后处于同一斜线上。以上两个方程分别等价于i-k=j-l和i-k=l-j。由此可知只要|i-k|=|j-l|成立,就表明2个皇后位于同一条斜线上。
代码:
#include <iostream>#include <cstdio>#include <cstdlib>#include <math.h>#define N 8 //皇后个数 using namespace std;int sum=0;bool Place(int k,int i,int *x);void NQueens(int k,int n,int *x);;void NQueens(int n,int *x);int main(){ int x[N]; for(int i=0;i<N;i++) x[i]=-1; NQueens(N,x); cout<<N<<"皇后共有"<<sum<<"种解!"<<endl; return 0;}bool Place(int k,int i,int *x) //判定两个皇后是否在同一列或在同一斜线上{ for (int j=0;j<k;j++) if ((x[j]==i)||(abs(x[j] -i)==abs(j-k))) return false; return true;}void NQueens(int k,int n,int *x) { for (int i=0;i<n;i++) { if(Place(k,i,x)) { x[k]=i; if (k==n-1) //输出所有可行解 { sum++; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(j==x[i]) cout<<" #"; else cout<<" _"; } cout<<endl; } cout<<endl; } else { NQueens(k+1,n,x); } } }}void NQueens(int n,int *x){ NQueens(0,n,x);}
运行截图:
其中#代表皇后
阅读全文
0 0
- 算法分析与设计回溯法之n皇后问题
- 算法分析与设计实验三 回溯法 24点问题 n皇后问题
- 算法设计与分析:第五章 回溯法 5.2n皇后
- 回溯算法与N皇后问题
- 回溯算法之 N皇后问题
- 回溯算法之N皇后问题
- 回溯算法之n皇后问题
- 经典回溯算法之N皇后问题
- 回溯算法之N皇后问题
- 经典回溯算法之n皇后问题
- 【算法分析】回溯法解八皇后问题(n皇后问题)
- 算法-回溯法初探-n皇后问题
- N皇后问题 算法 回溯法
- c++算法之回溯 八皇后延伸 N皇后问题
- 023-8皇后问题-回溯法-《算法设计技巧与分析》M.H.A学习笔记
- 回溯算法n皇后问题
- N皇后问题与回溯法
- N皇后问题与回溯法
- 《电路计算C++与MATLAB》学习笔记(三)
- window 让你告别cmd,安装cmder
- 单链表相关操作的C++实现
- 洗牌算法
- 链表的逆序输出
- 算法分析与设计回溯法之n皇后问题
- 《数学之美》第三章 统计语言模型
- 052day(静态成员)
- 学习计划
- 使用RxJava的retryWhen操作符实现token过期自动刷新
- python入门第一天——控制流
- 复制状态机(State Machine Replication)
- 在Ubuntu 16.04配置VNC Server (灰屏问题解决)
- Monitor项目开发走过的路~子线程Toast全解析