1 条题解

  • 1
    @ 2024-5-29 19:39:04

    经 典 题

    思路

    我们用 a[i]a[i] 表示第 ii 行是哪个棋子,f1[i]f1[i] 表示第 ii 列是否有棋子。

    难点就在于判断对角线上,我们可以发现由左上到右下的对角线满足行号-列号都是定值,右上到左下的对角线满足行号+列号都是定值。那么我们就可以利用这一点来判断,第 iijj 列的棋子处于 iji-ji+ji+j 这两条对角线上。但需要注意,iji-j 可能出现负值,需要 +n+n 来避免,i+ji+j 也有可能 >n>n,所以这两个数组都要开成 2×N2\times N 的。

    由于我们枚举棋子的排列就是按照字典序枚举的,所以输出得到的前三个答案即可。

    AC Code

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const ll N=15;
    ll n,a[N],ans;
    bool f1[N],f2[N*2],f3[N*2];
    void dfs(ll x){
        if(x==n+1){
            ans++;
            if(ans<=3)
                for(ll i=1;i<=n;i++)
                    printf("%lld%c",a[i],i==n?'\n':' ');
            return;
        }
        for(ll i=1;i<=n;i++)
            if(!f1[i]&&!f2[x-i+n]&&!f3[x+i]){
                a[x]=i,f1[i]=f2[x-i+n]=f3[x+i]=1;
                dfs(x+1);
                f1[i]=f2[x-i+n]=f3[x+i]=0;
            }
    }
    int main(){
        scanf("%lld",&n);
        dfs(1);
        printf("%lld",ans);
        return 0;
    }
    
    • 1

    [USACO1.5] 八皇后 Checker Challenge

    信息

    ID
    757
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    76
    已通过
    49
    上传者