您的位置:首页 > 其它

usaco 1.5.4 checker

2012-07-18 10:47 309 查看
终于到第一张最后一题了!不过最后一题果然有些难度,虽然是老问题“八皇后”,但是对于从没写过深搜的我来说还是一个挑战。好不容易花了很长时间写正确了深搜,结果也很在意料之中的超时,剪枝的话嫌太麻烦,于是去网上找优化方法,原来有一种叫做位操作的方法可以大大缩短时间,研究了一阵子才搞懂。这里感谢freddy's Blog,在那里借鉴了很多。我还会再改一改代码以更符合我的风格。下面贴出代码,以作纪念。

View Code

/*{
ID:jzy3209981
PROG:checker
LANG:C++
}*/
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<math.h>
using namespace std;
int result=0;
double deep[14];
void dfs(int a,int n,int rowc,int lc,int rc)
{
int i;

int sign=((1<<n)-1);
int row,l,r,p,po;
row=rowc;
l=lc;
r=rc;
if(row!=sign)
{
po=sign&~(row|lc|rc);
while(po!=0)
{
p=po&-po;
po-=p;
deep[a]=p;
dfs(a+1,n,row+p,(l+p)<<1,(r+p)>>1);
}
}
else
{
if(result<3)
for(i=0;i<n;i++)
{
if(i!=n-1)
printf("%.0f ",log(deep[i])/log(2)+1);
else
printf("%.0f\n",log(deep[i])/log(2)+1);
}
result++;
}
}
int main()
{
freopen ("checker.in","r",stdin);
freopen ("checker.out","w",stdout);
int n,a=0;
scanf("%d",&n);
dfs(a,n,0,0,0);
printf("%d\n",result);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: