P1219八皇后 Checker Challenge

题目传送门

点我

题目思路

DFS,深度是行,每次遍历列即可,使用三个数组,一个存结果,两个存两条对角线

AC代码

#include <iostream>
#include <vector>

using namespace std;

void dfs(int n, int x, vector<int> &a, vector<int> &b, vector<int> &c, int &ans)
{
    if (a.size() == n)
    {
        ans++;
        if (ans <= 3)
        {
            for (int i = 0; i < a.size(); i++)
            {
                cout << a[i] + 1 << " ";
            }
            cout << endl;
        }
        return;
    }
    if (x == n)
        return;
    for (int i = 0; i < n; i++)
    {
        // 找列,x是行
        bool flag = true;
        for (int j = 0; j < a.size(); j++)
        {
            if (a[j] == i || x - i == b[j] || i + x == c[j])
            {
                flag = false;
                break;
            }
        }
        if (flag)
        {
            a.push_back(i);
            b[x] = x - i; // 对角线
            c[x] = i + x;
            x++;
            dfs(n, x, a, b, c, ans);
            x--;
            a.pop_back();
        }
    }
}

int main()
{
    int n;
    cin >> n;
    vector<int> a;        // a是结果
    vector<int> b(n, 20); // b存对角线
    vector<int> c(n, 0);  // c存对角线
    int ans = 0;
    dfs(n, 0, a, b, c, ans);
    cout << ans << endl;
    return 0;
}