全WA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

P1219 [USACO1.5] 八皇后 Checker Challenge

Charlie0429 @ 2024-02-21 20:55:34

#include<bits/stdc++.h>
using namespace std;
int n,c[13];
int tot=0;
int sum=0;
void dfs(int step)
{
    if(step==n)
    {
        tot++;
        sum++;
        if(sum<=3)
        {
            for(int i=1;i<=step;i++)
            {
                cout<<c[i]<<' ';
            }
            cout<<'\n';
        }
    }else
    {
        for(int i=1;i<=n;i++)
        {
            int ok=1;
            c[step]=i;
            for(int j=0;j<step;j++)
            {
                if(c[step]==c[j]||step-c[step]==j-c[j]||step+c[step]==j+c[j])
                {
                    ok=0;
                    break;
                }
            }
            if(ok==1) dfs(step+1);
        }
    }
}
int main()
{
    cin>>n;
    dfs(0);
    cout<<tot;
    return 0;
}

by propitious @ 2024-02-21 22:09:18

dfs应该从1开始,还有终止条件应该是step>n不然少判断一行,改成下面这样就ac了

#include<bits/stdc++.h>
using namespace std;
int n,c[14];
int sum=0;
void dfs(int step)
{
    if(step>n)
    {
        sum++;
        if(sum<=3)
        {
            for(int i=1;i<=n;i++)
            {
                cout<<c[i]<<' ';
            }
            cout<<'\n';
        }
    }else
    {
        for(int i=1;i<=n;i++)
        {
            int ok=1;
            c[step]=i;
            for(int j=1;j<step;j++)
            {
                if(c[step]==c[j]||abs(step-j)==abs(c[step]-c[j]))
                {
                    ok=0;
                    break;
                }
            }
            if(ok==1) dfs(step+1);
        }
    }
}
int main()
{
    cin>>n;
    memset(c,0,sizeof(c));
    dfs(1);
    cout<<sum;
    return 0;
}

by propitious @ 2024-02-21 22:10:40

@propitious 还有那个tot可以不用重复记数。if的判断里改简洁了点


|