【洛谷】P1219 [USACO1.5]八皇后 Checker Challenge

Acode:

#include
using namespace std;
int n, a[100], b[100], c[100], d[100],ans;//n,行,列,对角线一,对角线二,结果
void print()//打印
{
    if (ans < 3)
    {
        for (int w = 1; w <= n; w++)
        {
            cout << a[w] << " ";
        }
        cout << endl;
    }
    ans++;//统计一共有多少解法
}
void dfs(int i)
{
    if (i > n)//结束
    {
        print();
        return;
    }
    else
    {
        for (int j = 1; j <= n; j++)//候选节点,具体一行的每一列
            //j从1开始,自然就是字典顺序最小
        {
            if (!b[j]&& !c[i + j] && !d[i - j + n])//该列没占过,该对角线一没占过,该对角线二没占过
            {
                a[i] = j;//把每一行的八皇后的位置标记,便于打印
                b[j] = 1;//标记
                c[i + j] = 1;//标记
                d[i - j + n] = 1;//标记
                dfs(i + 1);//换下一行dfs
                a[i] = 0;//回溯
                b[j] = 0;//回溯
                c[i + j] = 0;//回溯
                d[i - j + n] = 0;//回溯
            }
        }
    }
}
int main()
{
    cin >> n;//输入规模
    dfs(1);//从第一行开始找八皇后位置
    cout << ans;//输出结果
    return 0;//结束
}

over~

你可能感兴趣的:(深度优先,算法,c++)