[USACO1.5]八皇后 Checker Challenge

发布时间 2024-01-03 19:25:52作者: 努力吧少年^-^

这道题很明显就是用深度优先搜索,也就是DFS

那到底要怎么去DFS呢?

它说行,列,两条对角线不能在一起。所以DFS的行参就可以是行,再用一个数组存列,两个数组去存放两条对角线。(注:存两个对角线的要是行的2倍,要不然会数组越界

那么还有一个问题,就是每一种方法存的答案。

可以用一个a数组去存放答案

DFS的出口就是当行到达n+1,如果是到n的形况下,无法统计在第n行要放的列。

首先,先判答案是不是在2种及以下,应为是在判断后ans++的。如果小于3的话那么输出答案,否则方案数+1,返回上一次,return ;

if(r==n+1){
    if(ans<3){
        for(int i=1;i<=n;i++) cout<<a[i]<<" ";
        cout<<endl;
    }
    ans++;
    return ;
}

后面开一个for循环,枚举每一次可以放置的位置

先判断这两个对角线还有列在上面出现没,如果出现了就continue;

如果没有,就把这一列存放在a数组里,再两个对角线和列标上1

然后去上下一层,当他返回时,也就没有在走过这里列,所以要回溯,把这些变量都表1

for(int i=1;i<=n;i++){
    if(col[i]==1||d1[r-i+n]==1||d2[r+i]==1) continue;
    a[r]=i;
    col[i]=d1[r-i+n]=d2[r+i]=1;
    dfs(r+1);
    a[r]=col[i]=d1[r-i+n]=d2[r+i]=0;
}

 


主函数就不用我多说了,代码见下

int main(){
    cin>>n;
    dfs(1);
    cout<<ans;
    return 0;
}

 


这道题就这样结束了