#include <stdio.h>
#include <memory>
#define max_n 20
int map[max_n][max_n];
int col[max_n];
int a[2 * max_n - 1],b[2 * max_n - 1];
int count = 0;
void Trial(int i,int n){
//递归求解n皇后问题的一组解
//在进入本函数时,在n * n的棋盘前i - 1行已经放置了互不相互攻击的i - 1个皇后
//现在从第i行起继续为后续皇后选择合适位置
//当i > n时,求得一个合法布局,输出,结束
if(i > n){
for(int p = 1;p <= n;p++){
for(int q = 1;q <= n;q++)
printf("%d",map[p][q]);
printf("/n");
}
printf("%d/n/n",++count);
return ;
}
else{
for(int j = 1;j <= n;j++){
//剪枝,寻找一颗合法的状态树
if((col[j] == 0) && (a[i + j - 1] == 0) && (b[i + n - j] == 0)){
map[i][j] = i;
col[j] = i;
a[i + j - 1] = i;
b[i + n - j] = i;
//向前试探
//先序遍历目前状态的子树
Trial(i + 1,n);
//向后回溯
//恢复到目前状态下只放了i - 1个棋子时候的状态.(返回状态树的上一层)
//以判断第i个棋子的下一种摆放位置
map[i][j] = 0;
col[j] = 0;
a[i + j - 1] = 0;
b[i + n - j] = 0;
}
}
}
}
int main(){
memset(col,0,sizeof(col));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(map,0,sizeof(map));
Trial(1,8);
return 0;
}