N皇后问题拓展(DFS)

accbulb / 2024-02-11 / 原文

之前用DFS模板写的N皇后问题是采用打表的形式,先把皇后放好再遍历,这样做适合N小于11的问题,写洛谷的题的时候看到了这个N是大于11的,需要新的方法来解决,打表是不适用的。

P1219 [USACO1.5] 八皇后 Checker Challenge - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include<iostream>
using namespace std;
int n,m1[30],m2[30],m3[30],ans[15],res=0;
void setvalue(int step,int j,int k){
    ans[step]=j;
    m1[j]=k;
    m2[j+step]=k;
    m3[step-j+n]=k;
}
void dfs(int step){
    if(step>n){
        res++;
        if(res<=3){
            for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
            cout<<endl;
        }
        return;
    }
    for(int j=1;j<=n;j++){
        if(m1[j] || m2[step+j] || m3[step-j+n]) continue;
        setvalue(step,j,1);
        dfs(step+1);
        setvalue(step,j,0);
    }
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>n;
    dfs(1);
    cout<<res<<endl;
    
    return 0;
}