递归回溯
#include <stdio.h>
#define N 8
int place[N] = {0};
int flag[N] = {0};
int diag_1[2*N-1] = {0};
int diag_2[2*N-1] = {0};
int count = 0;
/*
* 初始化函数
*/
void init(){
for (int i = 0; i < N; ++i) {
flag[i] = 1;
}
for (int i = 0; i < 2 * N - 1; ++i) {
diag_1[i] = 1;
diag_2[i] = 1;
}
}
/*
* 打印函数
*/
void print(){
count++;
int queue[N][N] = {0};
for (int i = 0; i < N; ++i) {
queue[i][place[i]] = 1;
}
printf("NO.%d\n",count);
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
printf("%d|",queue[i][j]);
}
printf("\n");
}
}
/**
* @param matrix N*N矩阵
* @param row 行
* @param col 列
*/
void queue(int n){
for (int col = 0; col < N; ++col) {
if(flag[col] && diag_1[n-col+7] && diag_2[n+col]){
place[n] = col;
flag[col] = 0;
diag_1[n-col+7] = 0;
diag_2[n+col] = 0;
if(n < 7){
queue(n+1);
}
else{
print();
}
flag[col] = 1;
diag_1[n-col+7] = 1;
diag_2[n+col] = 1;
}
}
}
int main(){
init();
queue(0);
printf("count = %d",count);
return 0;
}