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("\n%d*%d\n",T,n);
319         printf("%d\n",ans);
320     }
321
322     return 0;
323 }

转载于:https://www.cnblogs.com/zwfymqz/p/6891125.html

2106. [NOIP2015] 斗地主相关推荐

  1. [NOIP2015] 斗地主

    斗地主 最后还是去看了题解,也算把坑填了吧.感觉大概是懂了,写一下思路.主要是因为还是老感觉哪里别扭想找个地方说出来 先放上代码 1 #include<bits/stdc++.h>//如果 ...

  2. noip2017考前整理(未完)

    快考试了,把我以前写过的题回顾一下. Noip2007 树网的核:floyd,推出性质,暴力. Noip2008 笨小猴:模拟 Noip2008 火柴棒等式:枚举 Noip2008 传纸条:棋盘dp ...

  3. [杂言] GoodBye,2016

    呼-- 2016年终于要过去了-- 就在这一年,我开始了-- 也就在这一年,我GG了-- 谨以此文纪念我过得不怎么好的2016. 一月 (我还是萌新求轻虐) 当时还在学习背包和深搜,突然dayu把yb ...

  4. 撸吧,你活不到明天了

    还记得PKAV上only_guest的那句话吗? 还在撸? 少年.删了LOL,拿起你的鼠标,跟我一起拯救世界! 真心地也劝君一句:小撸怡情,大撸伤身,强撸灰飞烟灭-_-(当然,如果你自认为是小撸的话就 ...

  5. NOIP2017暨2017年9月——11月学习总结

    NOIP2017结束了啊..在考场中心情起起伏伏..先是看一眼D2T1就想到思路的小兴奋..又是大样例调不过的紧张..还有找出代码里错误的那一刻的激动..(不知道会不会被卡常啊..)整个比赛的过程还是 ...

  6. [比赛|考试] 9月第一周的考试

    Sept 8th Sat 牛客网普及组赛(360pts/400pts)(100/100/100/60) T1水题不放代码,来个链接 T2乱膜膜就行了,注意膜出来是0要变成N,还有开longlong比较 ...

  7. 【NOIP2015 DAY1 T3 】斗地主(landlords)

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

  8. 【NOIP2015提高组Day1】斗地主

    嘿嘿,学老贺乱搞 文章目录 题面 心路历程 题解 官方版本 代码 彭奆版本 本人解法 代码 题面 博弈论??? 贪心??? 一脸懵逼*1??? 一脸懵逼*2??? 一脸懵逼*3??? ???????? ...

  9. 【NOIP2015】洛谷2668 斗地主

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

最新文章

  1. Git 版本还原命令
  2. matlab cfun,【图片】求求各位大佬帮弱鸡看看【matlab吧】_百度贴吧
  3. boost::hana::min用法的测试程序
  4. 文件的上传和下载---学习笔记
  5. python的gui库_tkinter——python的GUI标准库
  6. 数据结构学习(二)——单链表的操作之头插法和尾插法创建链表
  7. Java基础学习总结(158)——开发Leader如何做CodeReview
  8. 091115 T UI生成的类
  9. 评教数据的存储和显示问题
  10. excel做地图热力图_我做了一个傻瓜式热力图生成工具
  11. 高通平台环境搭建,编译,系统引导流程分析
  12. 游戏契合度提示音_产品/市场契合度
  13. 运筹优化算法工程师面试问题汇总
  14. Debian11 安装Chromium浏览器
  15. 【教程】如何批量将记事本文件或word文本转换成简体/繁体中文,下面教你方法
  16. 【注意力机制】BAM: Bottleneck Attention Module论文理解
  17. Java实现JWS生成与验签
  18. ADC基本原理与STM32F030ADC应用
  19. 平板电脑 android系统升级,戴尔平板电脑Streak 10 Pro升级至安卓3.2 官方教程
  20. 成都宏鑫软科技有限公司

热门文章

  1. 大神教你Nginx常用基础配置方案
  2. 团队项目改进与详细设计
  3. Java IO流(概述)
  4. phper需要掌握的技能(简)
  5. URL传递中文、Ajax传递中文,Java如何编码如何解决乱码
  6. js判断一个下拉框的选中值是否改变
  7. 问题 C: 判断三角形的性质
  8. Redis(三)主从复制实现高可用(redis—sentinel)
  9. 日历c语言程序,一个完整的日历程序(含有农历)
  10. python由编译器将源程序转化为机器语言_python初识