您的位置:首页 > 其它

【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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: