您的位置:首页 > 其它

USACO1.5.4 checker challenge

2011-03-24 21:05 393 查看
以前用pascal 写过的东西,这回是C++。明天去北校区给初中生讲N皇后,所以自己也熟悉一下呗!

/*
ID: wangqia6
TASK: checker
LANG: C++
*/

#include <fstream>
#include <cstring>
using namespace std;

const int NEED = 3;

ifstream infile;
ofstream outfile;
int n,now = 0,rec[15];
bool leftarr[30],rightarr[30],verarr[30];
long ans = 0;

void dfsa(int i)
{
if (i > n)
{
now++;
for (int j = 1; j < n; j++)
outfile << rec[j] << ' ';
outfile << rec
<< endl;
return;
}

for (int j = 1; j <= n; j++)
if ( !verarr[j] && !leftarr[i + j] && !rightarr[i - j + n - 1])
{
verarr[j] = true;
leftarr[i + j] = true;
rightarr[i - j + n - 1] = true;

rec[i] = j;
dfsa(i + 1);
if (now == NEED)
return;

verarr[j] = false;
leftarr[i + j] = false;
rightarr[i - j + n - 1] = false;
}

return;
}

void worka()
{
memset(verarr,0,sizeof(verarr));
memset(leftarr,0,sizeof(leftarr));
memset(rightarr,0,sizeof(rightarr));

dfsa(1);

return;
}

long lowbit(long x)
{
return x & -x;
}

void dfsb(int i, long verbit,long leftbit,long rightbit)
{
if (i > n)
{
ans++;
return;
}

long k,tmp = verbit & leftbit & rightbit;
while (tmp != 0)
{
k = lowbit(tmp);
tmp -= k;
verbit -= k;
leftbit -= k;
rightbit -= k;

dfsb(i + 1,verbit,(leftbit << 1) + 1,(rightbit >> 1) + (1 << (n-1)));

verbit += k;
leftbit += k;
rightbit += k;
}

return;
}

void workb()
{
dfsb(1,( 1 << n ) - 1,( 1 << n ) - 1,( 1 << n ) - 1);

return;
}

int main()
{
infile.open("checker.in");
outfile.open("checker.out");

infile >> n;

worka();
workb();

outfile << ans << endl;

infile.close();
outfile.close();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: