回溯法求解n皇后问题
2013-03-16 16:19
197 查看
【问题描述】
给定一个N×N的棋盘,寻找让N个皇后无冲突的放置方法,所有格子的一个方案。
注:按照国际象棋规则,皇后可以攻击与之处在同一列或同一行或同一斜线上的棋子。
【回溯法一般步骤】
(1) 针对所给问题,定义问题的解空间
(2) 确定易于搜索的解空间结构
(3) 以深度优先的方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索
【问题求解】
用数组x
表示n皇后问题的解,其中x[i]表示皇后i放在棋盘的第i行的第x[i]列。将n*n棋盘看作二维矩阵,其行号从上到下,列号从左到右编号为1,2,…,n。因此得到能够放置一个皇后的约束条件为:x[j]==x[k] 或者 abs(k-j)==abs(x[j]-x[k])。用回溯法解n皇后问题时,用完全n叉树表示解空间。可行性约束place剪去不满足约束条件的子树。
【运行结果】
请输入n:
4
解法1
- Q - -
- - - Q
Q - - -
- - Q -
解法2
- - Q -
Q - - -
- - - Q
- Q - -
请按任意键继续. . .
给定一个N×N的棋盘,寻找让N个皇后无冲突的放置方法,所有格子的一个方案。
注:按照国际象棋规则,皇后可以攻击与之处在同一列或同一行或同一斜线上的棋子。
【回溯法一般步骤】
(1) 针对所给问题,定义问题的解空间
(2) 确定易于搜索的解空间结构
(3) 以深度优先的方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索
【问题求解】
用数组x
表示n皇后问题的解,其中x[i]表示皇后i放在棋盘的第i行的第x[i]列。将n*n棋盘看作二维矩阵,其行号从上到下,列号从左到右编号为1,2,…,n。因此得到能够放置一个皇后的约束条件为:x[j]==x[k] 或者 abs(k-j)==abs(x[j]-x[k])。用回溯法解n皇后问题时,用完全n叉树表示解空间。可行性约束place剪去不满足约束条件的子树。
/*给定一个N×N的棋盘, 寻找让N个皇后无冲突的放置方法, 所有格子的一个方案 */ #include<iostream> #include<math.h> using namespace std; void backtrack(int t,int n,int *x); bool place(int k,int *x); int sum=0; int main() { int n; cout<<"请输入n:"<<endl; cin>>n; int *x=new int[n+1]; for(int i=0;i<=n;i++) x[i]=0; backtrack(1,n,x); if(sum==0) cout<<"无解!"<<endl; return 0; } void backtrack(int t,int n,int *x) {//用递归方法对整个解空间回溯搜索 if(t>n)//若t>n,则搜索到最后一行,得到一个合法解 { sum++; cout<<"解法"<<sum<<endl; for(int j=1;j<=n;j++) { for(int k=1;k<=n;k++) { if(x[j]==k) cout<<"Q "; else cout<<"- "; } cout<<endl; } cout<<endl<<endl; } for(int i=1;i<=n;i++) { x[t]=i; if(place(t,x)) backtrack(t+1,n,x);//递归回溯搜索 } } bool place(int k,int x[]) { for(int j=1;j<k;j++) if(abs(k-j)==abs(x[j]-x[k]) || x[j]==x[k]) return false; return true; }
【运行结果】
请输入n:
4
解法1
- Q - -
- - - Q
Q - - -
- - Q -
解法2
- - Q -
Q - - -
- - - Q
- Q - -
请按任意键继续. . .
相关文章推荐
- 数据结构与算法中的“递归”——用回溯法求解8皇后问题
- 回溯法求解N皇后问题(Java实现)
- 回溯法求解N-皇后问题
- 回溯法解决N皇后问题——递归与非递归求解
- 回溯法求解N皇后问题。
- 非递归求解N皇后问题(回溯法)
- N皇后问题利用回溯法求解
- 经典算法(1)——8皇后问题求解(回溯法)
- 回溯法求解N皇后问题
- 经典算法(1)——8皇后问题求解(回溯法)
- 回溯法求解 “n 皇后 问题”——Java 实现
- 用回溯法求解N皇后和迷宫问题
- 递归-回溯法求解8皇后问题(C)
- 回溯法求解n皇后和迷宫问题
- 回溯法求解N皇后问题
- 回溯法N皇后问题(以8为例)
- N 皇后问题-回溯法
- 回溯法(一)——n皇后问题
- 回溯法求解N人分N本书的问题(Java实现)
- 递归求解N皇后问题