八皇后
相当经典的一道深搜题目
依题我们可知n的范围为6-13, 可以用二维数组深搜暴力枚举,但是这样做的话每次深搜都要进行一次循环,很浪费时间。
我们可以知道在这道题目中行,列,两条对角线都是相互独立的,那么我们可以用四个数组,分别代表这四个来标记皇后的位置。
那么上代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 110;
int n;
int ans[15], sum;
bool a[50], b[50], c[50], d[50];
//a 代表行
//b 代表列
//c 代表从左下到右上, 行加列
//d 代表从左上到右下, 行减列
//因为主副对角线都只有一条,所以我们得保证c, d代表的数组必须标记的是同一个下标
//经过观察后可知,c所代表的对角线可以表示为x+y, d所代表的对角线可以表示为n+x-y(加一个n防止变成负数)
void dfs(int k)//k代表每一行行
{
if (k == n + 1)//判断条件输出
{
sum++;
if (sum <= 3)
{
for (int i = 1; i <= n; ++i)
{
cout << ans[i] << ' ';
}
cout << endl;
}
return;
}
for (int i = 1; i <= n; ++i)//i代表每一列
{
if (!a[k] && !b[i] && !c[k + i] && !d[k - i + n])
{
a[k] = 1, b[i] = 1; c[k + i] = 1, d[k - i + n] = 1;
ans[k] = i;
dfs(k + 1);
a[k] = 0, b[i] = 0; c[k + i] = 0, d[k - i + n] = 0;
}
}
return;
}
int main()
{
cin >> n;
dfs(1);
cout << sum << endl;
return 0;
}