USACO 1.1.5 Checker Challenge
Posted on 2007-06-03 19:22 ZelluX 閱讀(602) 評(píng)論(0) 編輯 收藏 所屬分類(lèi): Algorithm一開(kāi)始什么優(yōu)化都沒(méi)有,過(guò)不了了(記得以前是可以的啊)
然后用了三個(gè)hash數(shù)組記錄各列、對(duì)角線棋子的放置情況,再加上左右對(duì)稱(chēng)解的優(yōu)化,總算在0.828秒里過(guò)了
/**//*
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;
}
然后用了三個(gè)hash數(shù)組記錄各列、對(duì)角線棋子的放置情況,再加上左右對(duì)稱(chēng)解的優(yōu)化,總算在0.828秒里過(guò)了




















































































































