如何优化N-Queen回溯

时间:2016-02-12 09:30:12

标签: c++ backtracking

#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),但我不知道如何实现它。

0 个答案:

没有答案