求大佬帮忙看看问题

P1219 [USACO1.5] 八皇后 Checker Challenge

xxxxyz6667 @ 2024-07-10 14:01:57

#include<bits/stdc++.h>
using namespace std;
//int i=1;
int a[140],f[150][150],n;
void dfs(int i)
{
    if(i==n+1)//?
    {
        for(int k=1;k<=n;k++)
        {
            cout<<a[k]<<" ";
        }
        return ;
    }
    for(int k=1;k<=n;k++)
    {
        if(f[i][k]==1) continue;
        if(f[i-1][k]==1) continue;//下和右不用管,尽情占领 
        //if(f[i+1][j]==1) continue;
        if(f[i][k-1]==1) continue;
        //if(f[i][j+1]==1) continue;
        if(f[i-1][k-1]==1) continue;//左上角 
        if(f[i+1][k-1]==1) continue;//右上角
        f[i][k]=1;//占领这个位置
        a[i]=k;
        //cout<<i<<k;
        //f[i][k]=f[i-1][k]=f[i][k-1]=f[i-1][k-1]=f[i+1][k-1]=1;
        dfs(i+1);
        f[i][k]=f[i-1][k]=f[i][k-1]=f[i-1][k-1]=f[i+1][k-1]=0;//
        a[i]=0; //害
     } 
}
int main()
{
    cin>>n;
    //dfs(i);
    //for(int j=1;j<=3;j++)
    //{
        dfs(1);
    //}
}

by BlackWuKong @ 2024-07-10 14:04:45

我的代码如下:

#include<bits/stdc++.h>
using namespace std; 
int n,ans=0,a[22],tot[22],vis1[44],vis2[44]; 
void dfs(int x){
    if (x>n){
        ans++;
        if (ans<=3){
            for (int i=1;i<=n;i++) cout<<a[i]<<' ';
            cout<<endl;
        }
        return ;
    }
    for (int y=1;y<=n;y++){
        if (tot[y]==0&&vis1[x-y+n]==0&&vis2[x+y]==0){
            tot[y]=1;
            vis1[x-y+n]=1;
            vis2[x+y]=1;
            a[x]=y;
            dfs(x+1);
            tot[y]=0;
            vis1[x-y+n]=0;
            vis2[x+y]=0;
        }
    }
    return ; 
}
int main(){
    cin>>n;
    dfs(1);
    cout<<ans;
    return 0;
}

求关


by a18981826590 @ 2024-07-10 14:05:07

@xxxxyz6667

=1改为++

=0改为--


by a18981826590 @ 2024-07-10 14:06:01

@xxxxyz6667

#include<bits/stdc++.h>
using namespace std;
int a[20][20],n,s=0;
void x(int y){
    if(y>n){
        if(s<3){
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    if(a[i][j]==-1) printf("%d ",j);
                }
            }
            printf("\n");
        }
        s++;
        return;
    }
    for(int i=1;i<=n;i++){
        if(a[y][i]==0){
            for(int j=1;j<=n;j++) a[y][j]++;
            for(int j=1;j<=n;j++) a[j][i]++;
            for(int j=max(1,y-i+1);j<=min(n,n+y-i);j++) a[j][j+i-y]++;
            for(int j=max(1,y+i-n);j<=min(n,y+i-1);j++) a[j][y+i-j]++;
            a[y][i]=-1;
            x(y+1);
            for(int j=1;j<=n;j++) a[y][j]--;
            for(int j=1;j<=n;j++) a[j][i]--;
            for(int j=max(1,y-i+1);j<=min(n,n+y-i);j++) a[j][j+i-y]--;
            for(int j=max(1,y+i-n);j<=min(n,y+i-1);j++) a[j][y+i-j]--;
            a[y][i]=0;
        }
    }
}
int main(){
    scanf("%d",&n);
    x(1);
    printf("%d",s);
    return 0;
}

|