zoukankan      html  css  js  c++  java
  • [题解]洛谷P2668 斗地主

    洛谷AC10道蓝题纪念

    直接暴力搜索顺子、带牌

    搜索完每一层后,出完剩下的牌,因为一种牌只有一张、两张、三张、四张的情况,所以一定可以一次出完,保险起见,还是算一下为好(以防万一数据不好)

    代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    
    inline int read(){
        int x=0,w=1;char c=getchar();
        while(c<'0'||c>'9'){
            if(c=='-')w=-1;
            c=getchar();
        }
        while(c>='0'&&c<='9'){
            x=(x<<3)+(x<<1)+c-'0';
            c=getchar();
        }
        return x*w;
    }
    
    int n,t;
    int a[16]={0},ans;
    
    void dfs(int x){
        if(x>=ans)return;
        /*--------------顺子--------------*/
        //单顺
        int len=0;
        for(int i=3;i<=14;i++){
            if(a[i]<1)len=0;
            else{
                len++;
                if(len>=5){
                    for(int j=i-len+1;j<=i;j++)a[j]--;
                    dfs(x+1);
                    for(int j=i-len+1;j<=i;j++)a[j]++;
                }
            }
        }
        //双顺
        len=0;
        for(int i=3;i<=14;i++){
            if(a[i]<2)len=0;
            else{
                len++;
                if(len>=3){
                    for(int j=i-len+1;j<=i;j++)a[j]-=2;
                    dfs(x+1);
                    for(int j=i-len+1;j<=i;j++)a[j]+=2;
                }
            }
        }
        //三顺
        len=0;
        for(int i=3;i<=14;i++){
            if(a[i]<3)len=0;
            else{
                len++;
                if(len>=2){
                    for(int j=i-len+1;j<=i;j++)a[j]-=3;
                    dfs(x+1);
                    for(int j=i-len+1;j<=i;j++)a[j]+=3;
                }
            }
        }
        /*--------------带--------------*/
        for(int i=2;i<=15;i++){
            //有三张:三带一,三带一对 
            if(a[i]==3){
                a[i]-=3;
                for(int j=2;j<=15;j++){
                    if(a[j]>=1){
                        a[j]--;
                        dfs(x+1);
                        a[j]++;
                    }
                }
                for(int j=2;j<=14;j++){
                    if(a[j]>=2){
                        a[j]-=2;
                        dfs(x+1);
                        a[j]+=2;
                    }
                }
                a[i]+=3;
            }
            //有四张:三带一,三带一对 ,四带二,四带二对 
            if(a[i]>=4){
                //三带一(对) 
                a[i]-=3;
                for(int j=2;j<=15;j++){
                    if(a[j]>=1){
                        a[j]--;
                        dfs(x+1);
                        a[j]++;
                    }
                }
                for(int j=2;j<=14;j++){
                    if(a[j]>=2){
                        a[j]-=2;
                        dfs(x+1);
                        a[j]+=2;
                    }
                }
                a[i]+=3;
                //四带二(对) 
                a[i]-=4;
                for(int j=2;j<=15;j++){
                    for(int k=2;k<=15;k++){
                        if(j!=k&&a[j]>=1&&a[k]>=1){
                            a[j]--;a[k]--;
                            dfs(x+1);
                            a[j]++;a[k]++;
                        }
                    }
                }
                for(int j=2;j<=14;j++){
                    for(int k=2;k<=14;k++){
                        if(j!=k&&a[j]>=2&&a[k]>=2){
                            a[j]-=2;a[k]-=2;
                            dfs(x+1);
                            a[j]+=2;a[k]+=2;
                        }
                    }
                }
                a[i]+=4;
            }
        }
        /*--------------剩下的--------------*/
        for(int i=2;i<=15;i++){
            int cnt=0x3f;
            cnt=min(cnt,a[i]);
            cnt=min(cnt,a[i]/2+a[i]%2);
            cnt=min(cnt,a[i]/3+a[i]%3);
            cnt=min(cnt,a[i]/4+a[i]%4);
            x+=cnt;
        }
        ans=min(ans,x);
    } 
    
    int main(){
        t=read();n=read();
        while(t--){
            memset(a,0,sizeof(a));
            for(int i=1;i<=n;i++){
                int x=read();read();
                if(x==1)a[14]++;
                else if(x==0)a[15]++;
                else a[x]++;
            }
            ans=n;
            dfs(0);
            printf("%d
    ",ans);
        }
        return 0;
    }
    本篇文章为SHINE_GEEK原创,转载请注明来源!
    written_by:SHINE_GEEK

    -------------------------------------
    签名:自己选的路,跪着也要走完;理想的实现,需要不懈奋斗!
    -------------------------------------
  • 相关阅读:
    Python Data Analysis Library¶
    matadon/mizuno
    MySQL 5.1参考手册
    Apache Derby: Quick Start
    JRuby大捷:ThoughtWorks宣布Mingle发布在即
    RailsWithH2InJNDIOnJetty
    Embedded Jetty and Spring: The Lightweight Antidote for Java EE Complexity
    window下安装解压缩版mysql/zip压缩文件包非install安装程序
    Chapter 9. Extending Workbench
    Mysql手动增加一列_Blog of Grow_百度空间
  • 原文地址:https://www.cnblogs.com/sjrb/p/10399939.html
Copyright © 2011-2022 走看看