如何能够在 n×n 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?
即任两个皇后都不能处于同一条横行、纵行或斜线上。
深搜
// n 皇后问题
#include<stdio.h>
#include<cstring>
#include<math.h>
int count = 0, n;
int a[20], b[20]; // a:行 ,b:列
void judge(){
int i, j;
for(i = 1; i <= n; i++){
for(j = i+1; j <= n; j++){
// 判断任意两个皇后是否在同一斜线上
if((j-i) == abs(a[j] - a[i]))
return ;
}
}
count++;
}
void dfs(int m){
int i;
if(m > n)
judge();
for(i = 1; i <= n; i++){
if(b[i]){ // 如果当前列未被使用
b[i] = 0;
a[m] = i;
dfs(m+1);
b[i] = 1;
}
}
}
int main(){
int i;
scanf("%d", &n);
// 给列数组全赋值为1 ,1未使用, 0已使用
for(i = 0; i <= n; i++){
b[i] = 1;
}
dfs(1);
printf("%d", count);
return 0;
}
8皇后:92种
9皇后:350种
10皇后:724种