天天看點

There are 常數s 和 常數s! Usaco 1.5.4 Checker Challenge

/*

ID: zhangzz4

PROG: checker

LANG: C++

*/

#include<stdio.h>

#include<time.h>

const int N=13;

int v[N],cnt,n;

int _abs(int a){return a>0?a:-a;}

int vv[N],vv2[2*N],vv3[2*N];

void put(int x)

{

if(!x) return;

put(x/10);

putchar(x%10+'0');

}

int ok(int x,int r)

{

for(int i=0;i<r;i++)

if(v[i]==x||_abs(v[i]-x)==r-i) return 0;

return 1;

}

void dfs(int r)

{

if(n==r)

{

cnt++;

if(cnt<=3)

for(int i=0;i<n;i++)

{

put(v[i]+1);

putchar(i==n-1?'/n':' ');

}

return ;

}

for(int i=0;i<n;i++)

//if(ok(i,r)) 3600ms

if(vv[i]+vv2[n+i-r]+vv3[r+i]==0) //550ms

{

vv[i]=vv2[n+i-r]=vv3[r+i]=1;

v[r]=i;

dfs(r+1);

vv[i]=vv2[n+i-r]=vv3[r+i]=0;

}

}

int main()

{

freopen("checker.in","r",stdin);

freopen("checker.out","w",stdout);

//int cc=clock();

scanf("%d",&n);

dfs(0);

printf("%d/n",cnt);

// printf("%d ms/n",clock()-cc);

}