题目传送门
题目思路
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;
}