n皇后问题
在N*N(N<=10)的棋盘上放置N个皇后,使得他们不能相互攻击。两个皇后能相互攻击当且仅当他们在同一行,或者同一列,或者同一对角线上。
dfs基本格式
#include<iostream>
using namespace std;
void dfs(int x){//层数
if(达到目的) 输出(或者方案数+1)
else{
for(遍历所有的算符){
if(没有用到){
标记
dfs(x+1)//下一层递归
回溯
}
}
}
}
在这道题目中,“层数”可以等于“行”,即第x层递归可以等价于第x行,那么只需要检验对角线以及列数。又因为行数已经可以忽略不考虑(一定符合条件),我们可以用一维数组(p[11])存放皇后.
1.检验列,只需判断p[j]是否与已经放入的“皇后”位置不同,即p[j]!=i;
2.检验对角线,只需要判断“皇后”的行列之差(的绝对值)是否相等
#include<bits/stdc++.h>
using namespace std;
int n,ans,p[11];//一维数组p用来记录列
void Nqueen(int x){
if(x==n+1){//边界条件 即此时已经找完 计算方案数
ans++;
return;//返回函数
}
else{
for(int i=1;i<=n;i++){
bool ok=true;
for(int j=1;j<x;j++){//检查第x列之前
if((p[j]==i)||(abs(x-j)==abs(i-p[j]))){//第一部分判断皇后是否在同一列 第二部分判断是否在同一对角线
ok =false;
break;
}
}
if(ok){
p[x]=i;//放入
Nqueen(x+1);//下一列
p[x]=0;
}
}
}
}
int main(){
cin>>n;
Nqueen(1);//从第一行找起
cout<<ans;
return 0;
}