• 2106. [NOIP2015] 斗地主


     
     

    2106. [NOIP2015] 斗地主

    ★★★☆   输入文件:landlords.in   输出文件:landlords.out   简单对比
    时间限制:2 s   内存限制:1025 MB

    【题目描述】


    牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、方片的A到K加上大小王的共54张牌来进行的扑克牌游戏。在斗地主中,牌的大小关系根据牌的数码表示如下:3<4<5<6<7<8<9<10<J<Q<K<A<2<小王<大王,而花色并不对牌的大小产生影响。每一局游戏中,一副手牌由n张牌组成。游戏者每次可以根据规定的牌型进行出牌,首先打光自己的手牌一方取得游戏的胜利。

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

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

    具体规则如下:


    【输入格式】


    第一行包含用空格隔开的2个正整数Tn,表示手牌的组数以及每组手牌的张数。

    接下来T组数据,每组数据n行,每行一个非负整数对aibi表示一张牌,其中ai示牌的数码,bi表示牌的花色,中间用空格隔开。特别的,我们用1来表示数码A,11表示数码J,12表示数码Q,13表示数码K;黑桃、红心、梅花、方片分别用1-4来表示;小王的表示方法为01,大王的表示方法为02。


    【输出格式】

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

    【样例输入1】

    1 8
    7 4
    8 4
    9 1
    10 4
    11 1
    5 1
    1 4
    1 1
    

    【样例输出1】

    3

    【样例输入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 1
    11 3
    5 2
    12 4
    2 2
    7 2
    

    【样例输出2】

    6
    

    【提示】


    样例1说明


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

    对于不同的测试点, 我们约定手牌组数T与张数n的规模如下:


    数据保证:所有的手牌都是随机生成的。

    【来源】

    在此键入。


    这个题,,我不想多吐槽什么。。。。。。

    323行,四个小时,记录...

    虽然一开始就看出是暴力搜索了,,但是我写的是BFS,,从来没人AC的BFS。。

    好吧我也没AC不过拿了85分。。实在是没什么好优化的了。(传说可以加贪心)

    这道题的深搜,我想留到noip2017前夕写。

    留个纪念

    思路:

    暴力枚举所有可能出现的情况

    That all

    代码略长,留给以后的自己,请勿吐槽


      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<cmath>
      5 #include<queue>
      6 #include<map>
      7 using namespace std;
      8 const int MAXN=101;
      9 int T,n,pai_num,meiyong;
     10 int pai[MAXN];
     11 map<string,bool>mp;
     12 int js=0;
     13 struct node
     14 {
     15     int a[20];
     16     int step;
     17 }now,nxt;
     18 queue<node>q;
     19 int ans=0x7ffff;
     20 inline int pdvis(node p)
     21 {
     22     string gg;
     23     for(int i=1;i<=17;i++)
     24         gg=gg+(char)(p.a[i]-48);
     25     if(mp[gg]==1)return 0;
     26     else
     27     {
     28         mp[gg]=1;
     29         return 1;
     30     }
     31 }
     32 int read(int & n)
     33 {
     34     char c=getchar();
     35     int x=0,flag=0;
     36     while(c<'0'||c>'9')
     37     {if(c=='-')flag=1;
     38     c=getchar();}
     39     while(c>='0'&&c<='9')
     40         x=x*10+(c-48),c=getchar();
     41     if(flag==1)n= -x;
     42     else n= x;    
     43 }
     44 inline void init()
     45 {
     46     mp.clear();
     47     memset(pai,0,sizeof(pai));
     48     memset(now.a,0,sizeof(now));
     49     memset(nxt.a,0,sizeof(nxt));// 多组数据 
     50     for(int i=1;i<=n;i++)
     51     {
     52         read(pai_num);read(meiyong);
     53         if(pai_num==1)pai_num=14;// A
     54         if(pai_num==2)pai_num=15;// 2
     55         if(pai_num==0)
     56         {
     57             if(meiyong==1)pai_num=16;// 小王 
     58             else if(meiyong==2)pai_num=17;
     59         }
     60         pai[pai_num]++;
     61     }
     62 }
     63 inline void pd_danshun(node p)
     64 {
     65     int num=0;
     66     for(int i=3;i<=10;i++)
     67     {
     68         if(p.a[i]>=1)
     69         {
     70             num=1;
     71             for(int j=i+1;j<=14;j++)
     72             {
     73                 if(p.a[j]>=1)
     74                     num++;
     75                 else 
     76                     break;
     77             }
     78             if(num>=5)
     79             {
     80                 for(int j=i;j<=i+num-1;j++)
     81                 p.a[j]--;
     82                 for(int j=3;j<=17;j++)
     83                 nxt.a[j]=p.a[j];
     84                 nxt.step=p.step+1;
     85                 if(pdvis(nxt))
     86                 q.push(nxt);
     87                 for(int j=i;j<=i+num-1;j++)
     88                 p.a[j]++;
     89             }
     90         }
     91         
     92     }
     93 }
     94 inline void pd_shuangshun(node p)
     95 {
     96     int num=0;
     97     for(int i=3;i<=12;i++)
     98     {
     99         if(p.a[i]>=2)
    100         {
    101             num=1;
    102             for(int j=i+1;j<=14;j++)
    103             {
    104                 if(p.a[j]>=2)
    105                     num++;
    106                 else 
    107                     break;
    108             }
    109             if(num>=3)
    110             {
    111                 for(int j=i;j<=i+num-1;j++)
    112                 p.a[j]=p.a[j]-2;
    113                 for(int j=3;j<=17;j++)
    114                 nxt.a[j]=p.a[j];
    115                 nxt.step=p.step+1;
    116                 if(pdvis(nxt))
    117                 q.push(nxt);
    118                 for(int j=i;j<=i+num-1;j++)
    119                 p.a[j]=p.a[j]+2;
    120             }
    121         }
    122     }
    123 }
    124 inline void pd_sanshun(node p)
    125 {
    126     int num=0;
    127     for(int i=3;i<=13;i++)
    128     {
    129         if(p.a[i]>=3)
    130         {
    131             num=1;
    132             for(int j=i+1;j<=14;j++)
    133             {
    134                 if(p.a[j]==3)
    135                     num++;
    136                 else 
    137                     break;
    138             }
    139             if(num>=2)
    140             {
    141                 for(int j=i;j<=i+num-1;j++)
    142                 p.a[j]=p.a[j]-3;
    143                 for(int j=3;j<=17;j++)
    144                 nxt.a[j]=p.a[j];
    145                 nxt.step=p.step+1;
    146                 if(pdvis(nxt))
    147                 q.push(nxt);
    148                 for(int j=i;j<=i+num-1;j++)
    149                 p.a[j]=p.a[j]+3;
    150             }
    151         }
    152     }
    153 }
    154 inline void pd_three(node p)
    155 {
    156     for(int i=3;i<=15;i++)
    157     {
    158         if(p.a[i]==3)
    159         {
    160             for(int j=3;j<=15;j++)
    161             {
    162                 if(i!=j&&(p.a[j]==1||p.a[j]==2))
    163                 {
    164                     int tmp=p.a[j];
    165                     p.a[i]=0;
    166                     p.a[j]=0;
    167                     for(int k=3;k<=17;k++)
    168                         nxt.a[k]=p.a[k];    
    169                     nxt.step=p.step+1;
    170                     if(pdvis(nxt))
    171                     q.push(nxt);
    172                     p.a[i]=3;
    173                     p.a[j]=tmp;
    174                 }
    175             }
    176             p.a[i]=0;
    177             for(int l=3;l<=17;l++)
    178                 nxt.a[l]=p.a[l];
    179             nxt.step=p.step+1;
    180             if(pdvis(nxt))
    181             q.push(nxt);
    182             p.a[i]=3;
    183         }
    184     }
    185 }
    186 inline void pd_boom(node p)
    187 {
    188     for(int i=3;i<=17;i++)
    189     {
    190         if(p.a[i]==4)
    191         {
    192             for(int ll=3;ll<=17;ll++)
    193             {
    194                 for(int rr=3;rr<=17;rr++)
    195                 {
    196                     if((p.a[ll]==1&&p.a[rr]==1&&ll!=rr)||(p.a[ll]==2&&p.a[rr]==2&&ll!=rr))
    197                     {
    198                         int tmp=p.a[ll];
    199                         p.a[i]=0;
    200                         p.a[ll]=0;
    201                         p.a[rr]=0;
    202                         for(int kkk=3;kkk<=17;kkk++)
    203                         nxt.a[kkk]=p.a[kkk];
    204                         nxt.step=p.step+1;
    205                         if(pdvis(nxt))
    206                         q.push(nxt);
    207                         p.a[i]=4;
    208                         p.a[ll]=tmp;
    209                         p.a[rr]=tmp;
    210                     }
    211                 }
    212             }
    213             p.a[i]=0;
    214             for(int l=3;l<=17;l++)
    215             nxt.a[l]=p.a[l];
    216             nxt.step=p.step+1;
    217             if(pdvis(nxt))
    218             q.push(nxt);
    219             p.a[i]=4;
    220         }
    221     }
    222 }
    223 inline void pd_other(node p)
    224 {
    225     for(int i=3;i<=17;i++)
    226     {
    227         if(i==16)
    228         {
    229             if(p.a[i]==p.a[i+1]&&p.a[i]!=0)
    230             {
    231                 p.a[i]=0;
    232                 p.a[i+1]=0;
    233                 for(int l=3;l<=17;l++)
    234                 nxt.a[l]=p.a[l];
    235                 nxt.step=p.step+1;
    236                 if(pdvis(nxt))
    237                 q.push(nxt);
    238                 p.a[i]=1;
    239                 p.a[i+1]=1;
    240                 continue;
    241             }
    242         }
    243         if(p.a[i]==1||p.a[i]==2)
    244         {
    245             int tmp=p.a[i];
    246             p.a[i]=0;
    247             for(int l=3;l<=17;l++)
    248                 nxt.a[l]=p.a[l];
    249             nxt.step=p.step+1;
    250             
    251             if(pdvis(nxt))
    252             q.push(nxt);
    253             p.a[i]=tmp;
    254         }
    255     }
    256     
    257 }
    258 inline void chushihua()
    259 {
    260     for(int i=3;i<=17;i++)
    261     nxt.a[i]=7;
    262 }
    263 inline int findans(node p)
    264 {
    265     for(int i=3;i<=17;i++)
    266         if(p.a[i]!=0)
    267             return 0;
    268     return 1;
    269 }
    270 inline void gaoall(node p)
    271 {
    272     pd_boom(p);// 炸弹 
    273     chushihua();// 初始化 
    274     pd_danshun(p);// 单顺子 
    275     pd_shuangshun(p);// 双顺子 
    276     pd_sanshun(p);// 三顺子 
    277     pd_three(p);//
    278     pd_other(p);// 单,对,大小王 
    279 }
    280 void bfs()
    281 {
    282     js=0;
    283     for(int i=3;i<=17;i++)
    284         now.a[i]=pai[i];
    285     now.step=0;
    286     while(q.size()!=0)
    287     q.pop();
    288     ans=0x7ffff;
    289     q.push(now);
    290     while(q.size()!=0)
    291     {
    292         node p=q.front();
    293         q.pop();
    294         gaoall(p);
    295         if(findans(p)==1)
    296         {
    297             ans=min(ans,p.step);
    298             js++;
    299             if(js>=5)
    300             break;
    301         }
    302     }
    303 }
    304 int main()
    305 {
    306     freopen("landlords.in","r",stdin);
    307     freopen("landlords.out","w",stdout);
    308     read(T);read(n);
    309     while(T--)
    310     {
    311         init();
    312     /*    for(int i=1;i<=17;i++)cout<<i<<"  ";
    313         cout<<endl;
    314         for(int i=1;i<=17;i++)cout<<pai[i]<<"  ";
    315         cout<<endl;*/
    316         bfs(); 
    317     //    if(ans==2)
    318     //        printf("
    %d*%d
    ",T,n);
    319         printf("%d
    ",ans);
    320     }
    321     
    322     return 0;
    323 }
  • 相关阅读:
    Maven:Maven Wrapper
    ue4 shooterGame 第一步 搭建git linux服务器
    淌水 UE4的shootergame 案例 准备
    cesium+ geoserverTerrainProvide+png展示3D高程图展示
    geoserver使用curl发布 imagemosaic
    three.js 根据png生成heightmap
    github中cesium-terrain-builder和cesium-terrain-server使用
    geoServer 发布geoTiff格式的DEM数据
    NetCDF 入门
    java生成base64编码的png
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/6891125.html
Copyright © 2020-2023  润新知