一開始什么優化都沒有,過不了了(記得以前是可以的?。?br>然后用了三個hash數組記錄各列、對角線棋子的放置情況,再加上左右對稱解的優化,總算在0.828秒里過了

/**//*
PROG: checker
ID: 06301031
LANG: C++
*/

#include <iostream>
#include <fstream>

using namespace std;

int g[13];
bool column[13], diag1[25], diag2[25];
int n;
int countResult = 0;
int mid = 0, firstHalf = 0;
ifstream fin("checker.in");
ofstream fout("checker.out");


void DFS(int t)
{
int i;

if (t == n)
{
countResult++;

if (countResult <= 3)
{
fout << g[0] + 1;

for (i = 1; i < n; i++)
{
fout << " " << g[i] + 1;
}
fout << endl;
}
return;
}


for (g[t] = 0; g[t] < n; g[t]++)
{

if ((countResult > 3) && (t == 0))
{

if (g[t] == n / 2)
{
firstHalf = countResult;

if (n % 2 == 0)
{
fout << firstHalf * 2 << endl;
exit(0);
}
}

if ((g[t] == n / 2 + 1) && (n % 2 == 1))
{
mid = countResult - firstHalf;
fout << firstHalf * 2 + mid << endl;
exit(0);
}
}

if (column[g[t]])
{
continue;
}

if (diag1[g[t] + t])
{
continue;
}

if (diag2[g[t] - t + n])
{
continue;
}

diag1[g[t] + t] = true;
diag2[g[t] - t + n] = true;
column[g[t]] = true;
DFS(t + 1);
diag1[g[t] + t] = false;
diag2[g[t] - t + n] = false;
column[g[t]] = false;

nextPosition:
;
}
}


int main()
{
fin >> n;
int i;

for (i = 0; i < n; i++)
{
column[i] = false;
}

for (i = 0; i < n * 2 -1; i++)
{
diag1[i] = false;
diag2[i] = false;
}
DFS(0);
fout << countResult << endl;
fout.close();
return 0;
}




















































































































