zoukankan      html  css  js  c++  java
  • 斗地主

    首先题目规则就是斗地主的规则,只有大王和小王的规则与平时的斗地主有一点出入。就是暴搜,既然是暴搜代码就肯定是又臭又长(de)了三个小时的(bug)发现一个>写成了<,哭了啊。呜呜呜呜~~~。

    #include<bits/stdc++.h>
    using namespace std;
    #define scy(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
    inline int read(){
      int x=0,f=1;
      char ch=getchar();
      while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
      }
      while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
      }
      return x*f;
    }
    int t,n,ans,sum[25];
    void dfs (int x){
      if(x>=ans) return;
      //顺子
      int k=0;//顺子
      for(int i=3;i<=14;i++){
        if(sum[i]==0) k=0;
        else{
          k++;
          if(k>=5){
            for(int j=i;j>=i-k+1;j--) sum[j]--;
            dfs(x+1);
            for(int j=i;j>=i-k+1;j--) sum[j]++;
          }
        }
      }
      k=0;//连对
      for(int i=3;i<=14;i++){
        if(sum[i]<=1) k=0;
        else{
          k++;
    if(k>=3){
      for(int j=i;j>=i-k+1;j--) sum[j]-=2;
      dfs(x+1);
      for(int j=i;j>=i-k+1;j--) sum[j]+=2;
    }
    }
        }
      k=0;//类似飞机
      for(int i=3;i<=14;i++){
        if(sum[i]<=2) k=0;
        else{
          k++;
    if(k>=2){//飞机可以带牌
      for(int j=i;j>=i-k+1;j--) sum[j]-=3;
      dfs(x+1);
      for(int j=i;j>=i-k+1;j--) sum[j]+=3;
    }
    }
        }
    for(int i=2;i<=14;i++){//枚举有三张或四张的
      if(sum[i]<=3){
        if(sum[i]<=2) continue;
        sum[i]-=3;
        for(int j=2;j<=15;j++){
          if(sum[j]<=0||j==i) continue;
          sum[j]--;
          dfs(x+1);
          sum[j]++;
        }
        for(int j=2;j<=14;j++){
          if(sum[j]<=1||j==i) continue;
          sum[j]-=2;
          dfs(x+1);
          sum[j]+=2;
        }
        sum[i]+=3;
      }
      else{
        sum[i]-=3;
        for(int j=2;j<=15;j++){
          if(sum[j]<=0||j==i) continue;
          sum[j]--;
          dfs(x+1);
          sum[j]++;
        }
        for(int j=2;j<=14;j++){
          if(sum[j]<=1||j==i) continue;
          sum[j]-=2;
          dfs(x+1);
          sum[j]+=2;
        }
        sum[i]+=3;
    
        sum[i]-=4;
        for(int j=2;j<=15;j++){
          if(sum[j]<=0||j==i) continue;
          sum[j]--;
          for(int k=2;k<=15;k++){
            if(sum[k]<=0||j==k) continue;
            sum[k]--;
            dfs(x+1);
            sum[k]++;
          }
    sum[j]++;
        }
    for(int j=2;j<=14;j++){
      if(sum[j]<=1||j==i) continue;
      sum[j]-=2;
      for(int k=2;k<=14;k++){
        if(sum[k]<=1||j==k) continue;
        sum[k]-=2;
        dfs(x+1);
        sum[k]+=2;
      }
      sum[j]+=2;
    }
    sum[i]+=4;
    }
    }
    for(int i=2;i<=15;i++) if(sum[i]) x++;
    ans=min(ans,x);
    }
    int main(){
      //scy("in");
       t=read(),n=read();
      while(t--){
        ans=0x7fffffff;
        int x,y;
        memset(sum,0,sizeof sum);
        for(int i=1;i<=n;i++){
         x=read(),y=read();
          if(x==0) sum[15]++;
          else if(x==1) sum[14]++;
          else sum[x]++;
        }
        dfs(0);
        printf("%d
    ",ans);
      }
    }
    
  • 相关阅读:
    ASP.NET中JSON的序列化和反序列化
    C# 本地时间和GMT(UTC)时间的转换
    C# XmlReader/XmlWriter 类
    Xml 序列化
    XPath <第四篇>
    XML Schema <第三篇>
    .Net XML操作 <第二篇>
    XML基础<第一篇>
    Sql Server 面试题
    运用计划缓冲的建议
  • 原文地址:https://www.cnblogs.com/scy-fisheep/p/13816176.html
Copyright © 2011-2022 走看看