#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
ifstream f("damesah.in");
ofstream g("damesah.out");
int st[20], n,nrSol=0;
void afisare() {
for (int i = 1; i <= n; ++i) {
g << st[i] << " ";
}
g << "\n";
}
int valid(int k) {
for (int i = 1; i < k; ++i) {
if (st[k] == st[i] || abs(st[k]-st[i]) == abs(k-i))
return 0;
}
return 1;
}
void BK(int k) {
for (int i = 1; i <= n; ++i) {
st[k] = i;
if (valid(k)) {
if (k == n) {
++nrSol;
if(nrSol == 1)
afisare();
}
else
BK(k + 1);
}
}
}
int main()
{
f >> n;
BK(1);
g << nrSol << "\n";
return 0;
}
这是我使用回溯来解决N-Queen问题的代码,如果你不知道问题,这里是:N Queen是将N个国际象棋皇后放在N×N棋盘上的问题所以没有两个女王互相攻击。如果女王在同一列,行或同一对角线上,则攻击另一个女王。
如果我们插入4,输出将只显示第一个解决方案,然后显示第二行的解决方案数量:
2 4 1 3
2
我想使用一个更多的数组来优化这个算法,这个数组将存储对角线的行和女王使用的列,因此验证的复杂性将是O(1),但我不知道如何实现它。