n 皇后问题 研究的是如何将 n
个皇后放置在 n × n
的棋盘上,并且使皇后彼此之间不能相互攻击。不在同一列,不在对角线。
给你一个整数 n
,返回 n 皇后问题 不同的解决方案的数量。
输入:n = 4 输出:2 解释:如上图所示,4 皇后问题存在两个不同的解法。
rank[]表示第i行第pos列;
vis[]表示是否走过,true走过,false没有;
n=4表示4*4表格,cnt表示方法数;
初始化pos=1;表示第一行。由于第一个皇后如果在第一行第一列时,都不满足情况,所以从第一行第二列开始
#include<stdio.h>
#include<math.h>
#include <stdbool.h>
int rank[20];//pos列i行
bool vis[20];//标记第i行是否走过
int n=4,cnt=0;
void dfs(int pos){
if(pos==n+1){//递归边界条件
cnt++;
return;
}
for(int i=1;i<=n;i++){//枚举每行
if(vis[i]==false){
bool flag=true;
for(int j=1;j<pos;j++){//枚举pos之前的皇后
if(abs(pos-j)==abs(i-rank[j])){
flag=false;
break;
}
}
if(flag){
rank[pos]=i;//pos列在i行
vis[i]=true;
dfs(pos+1);
vis[i]=false;
}
}
}
}
int main(){
// scanf("%d",&n);
dfs(1);
printf("%d",cnt);
return 0;
}