• NOIP2015DAY1T3 斗地主


    描述

    牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、 方片的A到K加上大小王的共54张牌来进行的扑克牌游戏。在斗地主中,牌的大小关系根据牌的数码表示如下:

    3<4<5<6<7<8<9<10<J<Q<K<A<2〈小王〈大王,

    而花色并不对牌的大小产生影响。每一局游戏中,一副手牌由n张牌组成。游戏者每次可以根据规 定的牌型行出牌,首先打光自己的手牌一方取得游戏的胜利。

    现在,牛牛只想知道,对于自己的若干组手牌,分别最少需要多少次出牌可以将它 们打光。请你帮他解决这个问题。

    需要注意的是,本题中游戏者每次可以出手的牌型与一般的斗地主相似而略有不同。 具体规则如下:

    20170522103633_79631
    输入

    输入文件名为landlords.in。

    第一行包含用空格隔开的2个正整数T,n,表示手牌的组数以及每组手牌的张数。 接下来T组数据,每组数据n行,每行一个非负整数对^,^,表示一张牌,其中…表 示牌的数码,^表示牌的花色,中间用空格隔开。

    特别的,我们用1来表示数码A,11表 示数码J,12表示数码Q,13表示数码K;黑桃、红心、梅花、方片分别用1-4来表示;小 王的表示方法为0 1,大王的表示方法为0 2。

    输出

    输出文件名为landlords.out。

    共T行,每行一个整数,表示打光第i组手牌的最少次数。

    样例输入[复制]
    样例1:
    1 8
    7 4
    8 4
    9 1
    10 4
    11 1
    5 1
    1 4
    1 1

    样例2:
    1 17
    12 3
    4 3
    2 3
    5 4
    10 2
    3 3
    12 2
    0 1
    1 3
    10 1
    6 2
    12 3
    5 2
    12 4
    2 2
    7 2
    样例输出[复制]
    样例1:
    3

    样例2:
    6
    提示

    样例1说明:

    共有1组手牌,包含8张牌:方片7,方片8,黑桃9,方片10,黑桃J,黑桃5,方 片A以及黑桃A。可以通过打单顺子(方片7,方片8,黑桃9,方片10,黑桃J),单张 牌(黑桃5)以及对子牌(黑桃A以及方片A)在3次内打光。

     
    如果直接暴力搜索能有30分
      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 using namespace std;
      5 int ans=23,leftttttttt;
      6 int pai[30];
      7 void dfs(int s){
      8     //cout<<s<<endl; 
      9     if(s>=ans)return;
     10     if(leftttttttt==0){
     11         ans=min(ans,s);
     12         return;
     13     }
     14     if(pai[16]&&pai[17]){//火箭 
     15         pai[16]=0;
     16         pai[17]=0;
     17         leftttttttt-=2;
     18         dfs(s+1);
     19         leftttttttt+=2;
     20         pai[17]=1;
     21         pai[16]=1;
     22     }
     23     for(int i=3;i<=17;i++){//炸弹 
     24         if(pai[i]>=4){
     25             pai[i]-=4;
     26             leftttttttt-=4;
     27             dfs(s+1);
     28             leftttttttt+=4;
     29             pai[i]+=4;
     30         }
     31     }
     32     for(int i=3;i<=17;i++){//单张牌 
     33         if(pai[i]){
     34             pai[i]--;
     35             leftttttttt--;
     36             dfs(s+1);
     37             leftttttttt++;
     38             pai[i]++;
     39         }
     40     }
     41     for(int i=3;i<=17;i++){//对子牌 
     42         if(pai[i]>=2){
     43             pai[i]-=2;
     44             leftttttttt-=2;
     45             dfs(s+1);
     46             leftttttttt+=2;
     47             pai[i]+=2;
     48         }
     49     }
     50     for(int i=3;i<=17;i++){//三张牌 
     51         if(pai[i]>=3){
     52             pai[i]-=3;
     53             leftttttttt-=3;
     54             dfs(s+1);
     55             leftttttttt+=3;
     56             pai[i]+=3;
     57         }
     58     }
     59     for(int i=3;i<=17;i++){//三带一 
     60         if(pai[i]>=3){
     61             for(int j=3;j<=17;j++){
     62                 if(j==i)continue;
     63                 if(!pai[j])continue;
     64                 pai[i]-=3;
     65                 pai[j]--;
     66                 leftttttttt-=4;
     67                 dfs(s+1);
     68                 leftttttttt+=4;
     69                 pai[j]++;
     70                 pai[i]+=3;
     71             }
     72         }
     73     }
     74     for(int i=3;i<=17;i++){//三带二 
     75         if(pai[i]>=3){
     76             for(int j=3;j<=17;j++){
     77                 if(j==i)continue;
     78                 if(pai[j]<2)continue;
     79                 pai[i]-=3;
     80                 pai[j]-=2;
     81                 leftttttttt-=5;
     82                 dfs(s+1);
     83                 leftttttttt+=5;
     84                 pai[j]+=2;
     85                 pai[i]+=3;
     86             }
     87         }
     88     }
     89     for(int i=3;i<=17;i++){//四带二 
     90         if(pai[i]>=4){
     91             for(int j=3;j<=17;j++){
     92                 if(i==j)continue;
     93                 if(pai[j]<2)continue;
     94                 pai[i]-=4;
     95                 pai[j]-=2;
     96                 leftttttttt-=6;
     97                 dfs(s+1);
     98                 leftttttttt+=6;
     99                 pai[j]+=2;
    100                 pai[i]+=4;
    101             }
    102         }
    103     }
    104     for(int i=3;i<=13;i++){//单顺子 
    105         for(int j=i+4;j<=17;j++){
    106             int flag=0;
    107             for(int k=i;k<=j;k++){
    108                 if(!pai[k]){
    109                     flag=1;
    110                     break;
    111                 }
    112             }
    113             if(flag)continue;
    114             for(int k=i;k<=j;k++){
    115                 pai[k]--;
    116             }
    117             leftttttttt-=j-i+1;
    118             dfs(s+1);
    119             leftttttttt+=j-i+1;
    120             for(int k=i;k<=j;k++){
    121                 pai[k]++;
    122             }
    123         }
    124     }
    125     for(int i=3;i<=15;i++){//双顺子 
    126         for(int j=i+2;j<=17;j++){
    127             int flag=0;
    128             for(int k=i;k<=j;k++){
    129                 if(pai[k]<2){
    130                     flag=1;
    131                     break;
    132                 }
    133             }
    134             if(flag)continue;
    135             for(int k=i;k<=j;k++){
    136                 pai[k]-=2;
    137             }
    138             leftttttttt-=(j-i+1)*2;
    139             dfs(s+1);
    140             leftttttttt+=(j-i+1)*2;
    141             for(int k=i;k<=j;k++){
    142                 pai[k]+=2;
    143             }
    144         }
    145     }
    146     for(int i=3;i<=16;i++){//三顺子 
    147         for(int j=i+1;j<=17;j++){
    148             int flag=0;
    149             for(int k=i;k<=j;k++){
    150                 if(pai[k]<3){
    151                     flag=1;
    152                     break;
    153                 }
    154             }
    155             if(flag)continue;
    156             for(int k=i;k<=j;k++){
    157                 pai[k]-=3;
    158             }
    159             leftttttttt-=(j-i+1)*3;
    160             dfs(s+1);
    161             leftttttttt+=(j-i+1)*3;
    162             for(int k=i;k<=j;k++){
    163                 pai[k]+=3;
    164             }
    165         }
    166     }
    167 }
    168 int main(){
    169     int T,n;
    170     cin>>T>>n;
    171     int a,b;
    172     while(T--){
    173         memset(pai,0,sizeof pai);
    174         leftttttttt=n;
    175         for(int i=1;i<=n;i++){
    176             cin>>a>>b;
    177             if(a==1)pai[14]++;
    178             else if(a==2)pai[15]++;
    179             else if(a==0){
    180                 if(b==1)pai[16]++;
    181                 else pai[17]++;
    182             }
    183             else pai[a]++;
    184         }
    185         ans=23;
    186         dfs(0);
    187     //    for(int i=3;i<=17;i++)cout<<pai[i]<<" ";
    188         cout<<ans<<endl;
    189     }
    190 }
  • 相关阅读:
    LINUX怎么远程连接ORACLE数据库
    Debian 6配置GNOME桌面环境
    简简单单安装debian桌面工作环境
    NeHe OpenGL教程 第四课:旋转
    NeHe OpenGL教程 第三课:颜色渲染
    NeHe OpenGL教程 第二课:多边形
    NeHe OpenGL教程 第一课:OpenGL窗口
    Oracle数据库 External component has thrown an exception
    9. Ext基础1 -- Ext中 getDom、get、getCmp的区别
    8. Ext文本输入框:Ext.form.TextField属性汇总
  • 原文地址:https://www.cnblogs.com/saionjisekai/p/9564295.html
Copyright © 2020-2023  润新知