全WA,格式问题吗?

P1219 [USACO1.5] 八皇后 Checker Challenge

aton_puck @ 2023-08-06 15:41:38

#include <iostream>
using namespace std;
const int N= 13;
bool st[N][N];
bool COL[N];  //列
bool diag[N*2];//对角,左下到右上
bool undiag[N*2]; //反对角,左上到右下
int n;
int cnt=3; //输出前三个方案
int res=0;  //总方案数
void dfs(int u) //表示遍历到了第u行(从第0行开始)
{
    if(u == n) //放完了
    {
        res++;
        if(--cnt)
        {
            for(int i=0 ; i<n ; i++)
                for(int j=0 ; j<n ; j++)
                    if(st[i][j])
                        cout<<j+1<<" ";
            cout<<endl;
        }
        return;
    }

    for(int i=0 ; i<n ; i++)
    {
        if(!COL[i] && !diag[u+i] && !undiag[i-u+n-1])  //该位置可以放皇后
        {
            COL[i] = diag[u+i] = undiag[i-u+n-1] = true; //皇后放下
            st[u][i] = true;
            dfs(u+1);
            COL[i] = diag[u+i] = undiag[i-u+n-1] = false;  //恢复
            st[u][i] = false;
        }
    }

}
int main()
{
    cin>>n;
    dfs(0);
    cout<<res<<endl;
    return 0;
}

我输出的三行和样例的顺序不一样,不会因为这个吧?


by Gumingyi08 @ 2023-08-06 16:05:45

这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。

并把它们以上面的序列方法输出,解按字典顺序排列。

请输出前 3 个解。最后一行是解的总个数。


by ZhuZining_king @ 2023-08-20 12:04:30

#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int N=25;
int a[N];//保存哪行那列的

bool lie[N],zs[N],zx[N];//lie:列,zs:左上到右下,zx:左下到右上
int n,tot=0;//tot:记录答案个数
void f(int k)//f表示前k个已经排好了,接下来准备排k+1个
{
    if (k == n)//全排好了
    {
        tot++;//答案数增加
        if (tot <= 3)//输出前三个答案
        {
            for (int i=1;i<=n;i++)
            {
                cout << a[i] << ' ';
            }
            cout << endl;
        }
        return ;//结束
    }
    for (int i=1;i<=n;i++)//如果没有,枚举每个可能,准备在k+1行填充
    {
        if (lie[i] || zs[i-k-1+n] || zx[i+k+1])//如果填充,就continue掉
        {
            continue;
        }
        a[k+1]=i;//反之回溯掉
        lie[i]=zs[i-k-1+n]=zx[i+k+1]=true;
        f(k+1);
        lie[i]=zs[i-k-1+n]=zx[i+k+1]=false;
    }
}
int main()
{
    cin >> n;
    f(0);
    cout << tot << endl;
    return 0;
}

|