【NOIp 2015】斗地主(DFS)
2017-11-08 19:30
393 查看
枚举每一种情况,无脑dfs。(代码较长)
#include<bits/stdc++.h> using namespace std; int n,T,ans,a[20]; void dfs(int now,int dep){ if(dep>=ans) return; for(int i=now;i<=15;++i){ if(i==15){ ans=dep; return; } if(a[i]){ //case01 if(i==0 && a[1]){ --a[0];--a[1]; dfs(i,dep+1); ++a[0];++a[1]; } //case1 if(a[i]>=1){ //1 --a[i]; dfs(i,dep+1); ++a[i]; //3+1 for(int j=i+1;j<=14;++j){ if(a[j]>=3){ --a[i];a[j]-=3; dfs(i,dep+1); ++a[i];a[j]+=3; } } //4+1+1 for(int j=i+1;j<=14;++j){ if(a[j]>=4){ for(int k=i+1;k<=14;++k){ if(a[k]>=1 && k!=j){ --a[i];--a[k];a[j]-=4; dfs(i,dep+1); ++a[i];++a[k];a[j]+=4; } } } } //12345 if(i!=0 && i!=1 && i!=2 && a[i+1]&&a[i+2]&&a[i+3]){ --a[i];--a[i+1];--a[i+2];--a[i+3]; for(int j=i+4;j<=15;++j){ if(a[j]){ --a[j]; dfs(i,dep+1); } else{ for(int k=j-1;k>=i+4;--k) ++a[k]; break; } } ++a[i];++a[i+1];++a[i+2];++a[i+3]; } } //case2 if(a[i]>=2){ //2 a[i]-=2; dfs(i,dep+1); a[i]+=2; //3+2 for(int j=i+1;j<=14;++j){ if(a[j]>=3){ a[i]-=2;a[j]-=3; dfs(i,dep+1); a[i]+=2;a[j]+=3; } } //4+2+2 for(int j=i+1;j<=14;++j){ if(a[j]>=4){ for(int k=i+1;k<=14;++k){ if(a[k]>=2 && k!=j){ a[i]-=2;a[k]-=2;a[j]-=4; dfs(i,dep+1); a[i]+=2;a[k]+=2;a[j]+=4; } } } } //112233 if(i!=0 && i!=1 && i!=2 && a[i+1]>=2){ a[i]-=2;a[i+1]-=2; for(int j=i+2;j<=15;++j){ if(a[j]>=2){ a[j]-=2; dfs(i,dep+1); } else{ for(int k=j-1;k>=i+2;--k) a[k]+=2; break; } } a[i]+=2;a[i+1]+=2; } } //case3 if(a[i]>=3){ //3 a[i]-=3; dfs(i,dep+1); a[i]+=3; //3+1 for(int j=i+1;j<=14;++j){ if(a[j]>=1){ a[i]-=3;--a[j]; dfs(i,dep+1); a[i]+=3;++a[j]; } } //3+2 for(int j=i+1;j<=14;++j){ if(a[j]>=2){ a[i]-=3;a[j]-=2; dfs(i,dep+1); a[i]+=3;a[j]+=2; } } //111222 if(i!=0 && i!=1 && i!=2){ a[i]-=3; for(int j=i+1;j<=15;++j){ if(a[j]>=3){ a[j]-=3; dfs(i,dep+1); } else{ for(int k=j-1;k>=i+1;--k) a[k]+=3; break; } } a[i]+=3; } } //case4 if(a[i]>=4){ //4 a[i]-=4; dfs(i,dep+1); a[i]+=4; //4+1+1 for(int j=i+1;j<=14;++j){ if(a[j]){ for(int k=j+1;k<=14;++k){ if(a[k]){ a[i]-=4;--a[j];--a[k]; dfs(i,dep+1); a[i]+=4;++a[j];++a[k]; } } } } //4+2+2 for(int j=i+1;j<=14;++j){ if(a[j]>=2){ for(int k=j+1;k<=14;++k){ if(a[k]>=2){ a[i]-=4;a[j]-=2;a[k]-=2; dfs(i,dep+1); a[i]+=4;a[j]+=2;a[k]+=2; } } } } } return; } } } int main(){ // freopen("landlords.in","r",stdin); // freopen("landlords.out","w",stdout); scanf("%d%d",&T,&n); while(T--){ memset(a,0,sizeof(a)); for(int i=1;i<=n;++i){ int x,p; scanf("%d%d",&x,&p); if(x==1) x=14; if(x==0 && p==1) x=1; if(++a[x]==1) ++ans; } dfs(0,0); printf("%d\n",ans); } return 0; }
相关文章推荐
- 【NOIp 2015】【DFS】斗地主
- [BZOJ4325][NOIP2015]斗地主(dfs)
- bzoj 4325: NOIP2015 斗地主 dfs
- BZOJ_4325_NOIP2015 斗地主_DFS
- bzoj 4325: NOIP2015 斗地主 (dfs+剪枝)
- Noip2015 Day1 T3 斗地主(Dfs+Dp优化)
- [noip2015]斗地主(dfs+贪心)
- bzoj 4325 NOIP2015 斗地主 (dfs)
- NOIP2015斗地主[DFS 贪心]
- Noip2015 斗地主【搜索】【贪心】
- 洛谷 2668 [NOIP2015]斗地主
- 【BZOJ4325】NOIP2015 斗地主 搜索+剪枝
- 【BZOJ4325】NOIP2015 斗地主【搜索】【剪枝】
- NOIP2015 斗地主 (搜索剪枝)
- BZOJ 4325: NOIP2015 斗地主
- [BZOJ4326][NOIP2015]运输计划(二分+dfs序+树上差分)
- 【bzoj 4326】【codevs 4632】【UOJ #150】[NOIP 2015]运输计划(dfs+lca+二分答案+差分)
- 【bzoj 4325】【noip 2015】斗地主 暴力搜索
- 【NOIP2015】Day1T3 斗地主
- [NOIP 2015] 斗地主 landlord