#include <cstdio>//深度优先遍历棋盘找出所以的可能情况
#include <cstring>
#define MAXN 20
int map[3][MAXN] ;//利用二维数组map[2][]直接判断当前尝试的皇后所在的列和两个对角线是否有其他皇后
int sum = 0 , cas ;
void search(int position) {
if(position == cas) {//如果最后一个皇后可以放在棋盘上则有一个解
sum ++ ;
}else {
for(int i = 0 ; i < cas ; i ++) {//循环选择皇后的位置
if(!map[0][i] && !map[1][position + i] && !map[2][position - i + cas]) {//如果此时尝试的皇后所在的列和两个对角线没有其他皇后
map[0][i] = 1 ; map[1][position + i] = 1 ; map[2][position - i + cas] = 1 ;//则假设此时皇后可以在这里
search(position + 1) ;//递归判断其他的皇后的情况
map[0][i] = 0 ; map[1][position + i] = 0 ; map[2][position - i + cas] = 0 ;//然后回溯回来此时皇后不在这个位置的情况
}
}
}
}
int main(int argc, char const *argv[])
{
while( ~scanf("%d" , &cas) ) {//在一个棋盘为cas x cas的棋盘上皇后可以摆放的可能情况
sum = 0 ;
search(0) ;
printf("%d\n", sum);
}
return 0;
}
基于八皇后上的N皇后问题
最新推荐文章于 2021-02-13 04:59:46 发布