0分求调

P1219 [USACO1.5] 八皇后 Checker Challenge

User586768 @ 2023-10-04 19:50:02

#include <bits/stdc++.h>
using namespace std;
int n,ud[1000];//  \左上右下,x-y恒等 j
int du[1000];//   /左下右上,x+y恒等 k
int l[1000];// 行,左右 y
int r[1000];//列,上下 x
int ans[1000];
int cnt=0;
int t=0;
void dfs(int val){
    if(val==n+1){
        if(t<3){
            for(int i=0;i<n;i++){
                cout<<ans[i]<<' ';
            }
            cout<<endl;
        }
        t++;
    }
    for(int i=1;i<=n;i++){
        int y=val,x=i;
        int j=abs(x-y),k=abs(x+y);
        if(l[y]==0&&r[x]==0&&ud[j]==0&&du[k]==0){
            l[y]++;
            r[x]++;
            ud[j]++;
            du[k]++;
            ans[cnt++]=i;
            dfs(val+1);
            ans[--cnt]=0;
            l[y]--;
            r[x]--;
            ud[j]--;
            du[k]--;
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    cin>>n;
    dfs(1);
    cout<<t;
    return 0;
}

by Nefertari_fly @ 2023-10-04 19:59:15

哥,看看我改的代码,主要是中间那几个数组出问题了,我改了下,这样能过

#include <bits/stdc++.h>
using namespace std;
int n,ud[1000];//  \左上右下,x-y恒等 j
int du[1000];//   /左下右上,x+y恒等 k
int l[1000];// 行,左右 y
int r[1000];//列,上下 x
int ans[1000];
int cnt=0;
int t=0;
void dfs(int val){
    if(val==n+1){
        if(t<3){
            for(int i=1;i<=n;i++){
                cout<<ans[i]<<' ';
            }
            cout<<endl;
        }
        t++;
        return;
    }
    for(int i=1;i<=n;i++){
        //int y=val,x=i;
        //int j=abs(x-y),k=abs(x+y);
        if(r[i]==0&&ud[val+i-1]==0&&du[val-i+n]==0){
            r[i]=1;
            ud[val+i-1]=1;
            du[val-i+n]=1;
            ans[val]=i;
            dfs(val+1);
            r[i]=0;
            ud[val+i-1]=0;
            du[val-i+n]=0;
        }
    }
}
int main(){
    cin>>n;
    dfs(1);
    cout<<t;
    return 0;
}

|