草泥马的斗地主

来源:互联网 发布:淘宝上什么假货最多 编辑:程序博客网 时间:2024/04/28 11:05

#include<cstdio> #include<cstring>using namespace std;int n,t,s[15];int ans,a,b;int min(int a,int b){return a>b?b:a;}void dfs(int now){    if(now>ans) return;    int s1,s2,s3,s4;    s1=s2=s3=s4=0;    for(int i=1;i<=14;i++) if(s[i]==1) s1++;//统计单牌和对牌个数;     for(int i=1;i<=14;i++) if(s[i]==2) s2++;    for(int i=1;i<=14;i++) if(s[i]==4){        s4++;        if(s1>=2) s1-=2;           //四能多带尽量多带;         else if(s2>=2) s2-=2;        else if(s2>=1) s2--;    }    for(int i=1;i<=14;i++)if(s[i]==3){        s3++;            if(s1>=1) s1--;           //三带;         else if(s2>=1) s2--;    }    ans=min(ans,now+s1+s2+s3+s4);    int j;    for(int i=1;i<=8;i++){       //有单顺子的情况;         for(j=i;j<=12;j++){            s[j]--;            if(s[j]<0) break;            if(j-i>=4) dfs(now+1);        }        if(j==13) j--;          //回溯;         while(j>=i) s[j--]++;    }    for(int i=1;i<=10;i++){     //有双顺子的情况;         for(j=i;j<=12;j++){            s[j]-=2;            if(s[j]<0) break;            if(j-i>=2) dfs(now+1);        }        if(j==13) j--;         //回溯;         while(j>=i) s[j--]+=2;    }    for(int i=1;i<=11;i++){    //有三顺子的情况;         for(j=i;j<=12;j++){              s[j]-=3;            if(s[j]<0) break;            if(j-i>=1) dfs(now+1);        }        if(j==13) j--;         //回溯;         while(j>=i) s[j--]+=3;    }}int main(){    scanf("%d%d",&t,&n);    while(t--){        memset(s,0,sizeof(s));        ans=23;        for(int i=1;i<=n;i++){ //将A,2,大王,小王放到最后;             scanf("%d%d",&a,&b);            if(a==0) s[14]++;            if(a==1) s[12]++;            if(a==2) s[13]++;            if(a>=3) s[a-2]++;        }        dfs(0);        printf("%d\n",ans);    }    return 0;}

去年暴0真是永远的痛啊。。。没什么可说的。。。就是先枚举所有顺子的情况,,,然后再出。据说带牌要尽量带单牌。。。表示我打扑克还是太弱了啊。。

0 0
原创粉丝点击