前言
这是一道经典的暴搜题,用的是电风扇(dfs深搜)接下来我会带大家一起攻克这道水题——
思路详解
主函数不需要我过多解释了,一个void dfs(就解决了),好,直接上代码:
int main(){
cin>>n;
dfs(1);
cout<<sum;
return 0;
}
定义void dfs函数,我们需要用四条线来限制王后,所以需要定义四个数组——(尽在注释里)
void dfs(int step){
//遍历完了
if(step>n){
//种类++
sum++;
//题目限制输出三种
if(sum<=3){
//输出流~
for(int i=1;i<=n;i++){
cout<<ans[i]<<" ";
}
cout<<endl;
}
}
for(int i=1;i<=n;i++){
//三条线限制
if((!b[i])&&(!c[step+i])&&(!d[step-i+n])){
//标记为占领橫竖对角线
b[i]=1;
c[step+i]=1;
d[step-i+n]=1;
ans[step]=i;
//继续搜
dfs(step+1);
//回溯寻找所有情况
b[i]=0;
c[step+i]=0;
d[step-i+n]=0;
}
}
return ;
}
最后放纯净代码————
#include<bits/stdc++.h>
using namespace std;
int sum;
int ans[100],b[100],c[100],d[100];
int n;
void dfs(int step){
if(step>n){
sum++;
if(sum<=3){
for(int i=1;i<=n;i++){
cout<<ans[i]<<" ";
}
cout<<endl;
}
}
for(int i=1;i<=n;i++){
if((!b[i])&&(!c[step+i])&&(!d[step-i+n])){
b[i]=1;
c[step+i]=1;
d[step-i+n]=1;
ans[step]=i;
dfs(step+1);
b[i]=0;
c[step+i]=0;
d[step-i+n]=0;
}
}
return ;
}
int main(){
cin>>n;
dfs(1);
cout<<sum;
return 0;
}