题目:将n个皇后放置在一个n*n的棋盘上,使皇后彼此之间不相互攻击。已知在同一行、同一列、同一对角线上,皇后之间都会相互攻击。
#include<iostream>
using namespace std;
const int N=10;
int a[N];
int n;
int cnt;
bool check(int row,int col){//第row行上能不能将皇后放在第i列
for(int i=1;i<row;i++){
if(a[i]==col) return false;//同一列
if(a[i]+i==row+col) return false; //同一副对角线
if(i-a[i]==row-col) return false;//同一 主对角线
}
return true;
}
void dfs(int row){
if(row==n+1){
cnt++;
return;
}
for(int i=1;i<=n;i++){
if(check(row,i)){
a[row]=i;
dfs(row+1);
a[row]=0;
}
}
}
int main(){
scanf("%d",&n);
dfs(1);
printf("%d",cnt);
return 0;
}
思路:一行一行地放置皇后,dfs(1)表示第1行放置皇后的位置,a[i]表示第i行的皇后放在第a[i]列。for循环遍历每个位置(列),满足check条件后,即可放置。check函数:判断第row行的皇后能不能放在col位置上。能不能放,需要通过前row行的皇后们来判断。