注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

那一日,泪水打湿雪花冰冷的心

曾经的滋味,回忆在一次次的离合中,回眸时,那一刻,如涟漪般在一刹那融化

 
 
 

日志

 
 

POJ 1143  

2010-07-17 23:41:05|  分类: poj |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
根据必胜态和必输态的定义,直接搜索即可,然后就是记忆化搜索和二进制优化加速
#include<cstdio>
#include<cstring>
int n,a[21],k,ans[21],t,w=1;
int q[1048575];
int dfs(int x,int y){
if(x==0)
return 0;
if(q[x]!=-1)
return q[x];
for(int i=0;i<n;++i)
if((1<<i)&x){
int k=a[i],y0=y,x0=x;
for(int j=0;j<22-k;++j)
if((1<<j)&y0)
y0=y0|(1<<(j+k));
for(int j=0;j<n;++j)
if(((1<<j)&x)&&(y0&(1<<a[j])))
x0=x0^(1<<j);
if(!dfs(x0,y0))
return q[x]=1;
}
return q[x]=0;
}
int main(){
while(scanf("%d",&n),n){
memset(q,-1,sizeof(q));
k=(1<<22)-3;
for(int i=0;i<n;++i){
scanf("%d",&a[i]);
k=k^(1<<a[i]);
}
for(int i=0;i<n;++i)
for(int j=i+1;j<n;++j)
if(a[i]>a[j]){
a[i]+=a[j];
a[j]=a[i]-a[j];
a[i]=a[i]-a[j];
}
t=0;
for(int i=0;i<n;++i){
int k0=a[i],y0=k,x0=(1<<n)-1;
for(int j=0;j<22-k0;++j)
if((1<<j)&y0)
y0=y0|(1<<(j+k0));
for(int j=0;j<n;++j)
if(y0&(1<<a[j]))
x0=x0^(1<<j);
if(!dfs(x0,y0))
ans[t++]=a[i];
}
printf("Test Case #%d\n",w++);
if(!t)
printf("There's no winning move.\n\n");
else{
printf("The winning moves are: ");
for(int i=0;i<t-1;++i)
printf("%d ",ans[i]);
printf("%d\n\n",ans[t-1]);
}
}
return 0;
}
  评论这张
 
阅读(886)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017