社区讨论

警示后人&已ac但是有疑问

P1219[USACO1.5] 八皇后 Checker Challenge参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhj1vzyo
此快照首次捕获于
2025/11/03 19:22
4 个月前
此快照最后确认于
2025/11/03 19:22
4 个月前
查看原帖
请把数组开大点! 但是我的疑问就是为什么要把数组开大。。
改前代码(12pts):
CPP
#include <bits/stdc++.h>
using namespace std;
int ans,n;
int f[15],f1[15],f2[15],f3[15];
void dfs(int k){
    if(k>n){
        ans++;
        if(ans<=3){
            for(int i=1;i<=n;i++) cout<<f[i]<<" ";
            cout<<'\n';
        }
        return;
    }
    for(int i=1;i<=n;i++){
        if(f1[i]==0&&f2[k+i]==0&&f3[k-i+15]==0){
            f[k]=i,f1[i]=1,f2[k+i]=1,f3[k-i+15]=1;
            dfs(k+1);
            f1[i]=0,f2[k+i]=0,f3[k-i+15]=0;
        }
    }
    return;
}
int main(){
    cin>>n;
    dfs(1);
    cout<<ans;
    请不要复制粘贴代码
}
改后:(ac)
CPP
#include <bits/stdc++.h>
using namespace std;
int ans,n;
int f[114514],f1[114514],f2[114514],f3[114514];
void dfs(int k){
    if(k>n){
        ans++;
        if(ans<=3){
            for(int i=1;i<=n;i++) cout<<f[i]<<" ";
            cout<<'\n';
        }
        return;
    }
    for(int i=1;i<=n;i++){
        if(f1[i]==0&&f2[k+i]==0&&f3[k-i+15]==0){
            f[k]=i,f1[i]=1,f2[k+i]=1,f3[k-i+15]=1;
            dfs(k+1);
            f1[i]=0,f2[k+i]=0,f3[k-i+15]=0;
        }
    }
    return;
}
int main(){
    cin>>n;
    dfs(1);
    cout<<ans;
    请不要复制粘贴代码
}
有大佬说一说为什么吗

回复

2 条回复,欢迎继续交流。

正在加载回复...