• 斗地主(大暴搜)


    大暴搜题;
    搜索顺子,然后把剩下的牌按照四带,三带,对牌,单牌打出;
    顺子有单顺,双顺,三顺。

    我一开始处理时把大小王分开处理了,不知啥原因不对,只有30 fen;
    然后把大小王看做对牌后,就ac了。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<cmath>
    using namespace std;
    int T,n,ans;
    int a[20];
    void dfs(int step)
    {
        if(step>ans) return;//剪枝 
    
        int t1=0,t2=0,t3=0,t4=0;
        for(int i=1;i<=15;i++)
        {
            if(a[i]==1) t1++;
            if(a[i]==2) t2++;
        }
        for(int i=1;i<=15;i++)//四带牌 
        {
            if(a[i]==4) 
            {
                t4++;
                if(t1>=2) t1-=2;
                 else if(t2>=2) t2-=2;
                  else if(t2>=1) t2--;
            }   
        }
        for(int i=1;i<=15;i++)//三带牌 
        {
            if(a[i]==3) 
            {
                t3++;
                if(t1>=1) t1--;
                else if(t2>=1) t2--; 
            }   
        }
        ans=min(ans,step+t1+t2+t3+t4);
    
        //下面开始枚举顺子 
        int j;
        for(int i=1;i<=8;i++)//枚举单顺子 
        {
            for(j=i;j<=12;j++)
            {
                a[j]-=1;
                if(a[j]<0) break;
                if(j-i>=4) dfs(step+1);//大于等于5张构成单顺           
            }   
            //回溯 
            if(j==13) j--;
            for(int k=j;k>=i;k--)
             a[k]++;
        }
        for(int i=1;i<=10;i++)//枚举双顺子 
        {
            for(j=i;j<=12;j++)
            {
                a[j]-=2;
                if(a[j]<0) break;
                if(j-i>=2) dfs(step+1);//大于等于3对构成双顺            
            }   
            //回溯 
            if(j==13) j--;
            for(int k=j;k>=i;k--)
             a[k]+=2; 
        }
        for(int i=1;i<=11;i++)
        {
            for(j=i;j<=12;j++)
            {
                a[j]-=3;
                if(a[j]<0) break;
                if(j-i>=1) dfs(step+1); 
            } 
            //回溯 
            if(j==13) j--;
            for(int k=j;k>=i;k--)
             a[k]+=3; 
        }
        //return;
    }
    int main()
    {
        //freopen("a.out","w",stdout); 
        scanf("%d%d",&T,&n);
        while(T--)
        {
            ans=23;
            memset(a,0,sizeof(a));
            for(int i=1;i<=n;i++)
            {
                int x,y;
                scanf("%d%d",&x,&y);
                if(x>=3)a[x-2]++;
                if(x==1||x==2) a[x+11]++;
                if(x==0) a[14]++;
            }
            //for(int i=1;i<=15;i++) printf("%d ",a[i]);puts("");
            dfs(0);
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    5月9日黑马java之java中四种权限修饰符
    MOOCjava之输入输出
    5月7日黑马java之final关键字的用法
    MOOCjava之数据库基础
    MOOCjava之线程
    毕业设计
    shiro 权限
    Spring Boot Thymeleaf
    Spring Boot文件处理
    Spring Boot Rest模板
  • 原文地址:https://www.cnblogs.com/dfsac/p/7587908.html
Copyright © 2020-2023  润新知