计算机算法设计与分析(第5版)王晓东著 p135
- 显约束为n个皇后不能位于同一行
- 隐约束为n个皇后不能位于同一列 和 不能位于同一斜线【剪枝的条件】
- 解空间树:n叉树; 共有n的n次方(n^n)种情况
- 递归回溯的方法
- 返回皇后的位置列数
- 可行的n后方案 不一定随着棋盘的变大,方案就别多,比如n=6时,方案就比较少
代码如下:
//n后问题 - 解空间是 n叉树 递归回溯 返回皇后的列数
#include<stdio.h>
#define n 6 // 有n个皇后,n*n 棋盘
//剪枝条件
int place(int k,int x[]){
for(int i=1;i<k;i++){
if(i+x[i]==k+x[k]||i-x[i]==k-x[k]||x[k]==x[i]){
return false;
}
}
return true;
}
int sum=0;
//遍历子树
void demo(int k,int x[]){
if(k>n){
sum++; //可行方案总数
printf("可行皇后位置:");
for(int j=1;j<=n;j++){
printf("%d ",x[j]);
}
printf("\nsum:%d\n",sum);
}else{
for(int i=1;i<=n;i++){
x[k]=i;
if(place(k,x)){
demo(k+1,x);
}
}
}
// printf("sum:%d\n",sum);
}
int main(){
int x[n];
for(int i=0;i<=n;i++){
x[i]=0;
}
int t =1; //代表第几个皇后
demo(t,x);
return 0;
}