题目链接

写了俩小时+把....有一种情况写的时候漏了...代码还算清晰把,想了很久才开写的。

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4 using namespace std;
  5 int p[21],flag[60],o[21],ans[60];
  6 int sp[21];
  7 int que[21];
  8 char str[15][3];
  9 int hu13[13] = {1,11,21,9,19,29,33,36,39,42,45,48,51};
 10 void judge13()
 11 {
 12     int i;
 13     int s1,s0,s2,key;
 14     s1 = s2 = s0 = 0;
 15     for(i = 0; i < 13; i ++)
 16     {
 17         if(flag[hu13[i]] == 0)
 18         {
 19             s0 ++;
 20             key = hu13[i];
 21         }
 22         else if(flag[hu13[i]] == 1)
 23             s1 ++;
 24         else if(flag[hu13[i]] == 2)
 25             s2 ++;
 26     }
 27     if(s1 == 13)
 28     {
 29         for(i = 0; i < 13; i ++)
 30             ans[hu13[i]] = 1;
 31     }
 32     else if(s1 == 11&&s2 == 1&&s0 == 1)
 33     {
 34         ans[key] = 1;
 35     }
 36     return ;
 37 }
 38 void judge7d()
 39 {
 40     int i,num = 0,key;
 41     for(i = 1; i < 60; i ++)
 42     {
 43         if(flag[i] == 2)
 44             num ++;
 45         else if(flag[i] == 1)
 46             key = i;
 47     }
 48     if(num == 6)
 49         ans[key] = 1;
 50     return ;
 51 }
 52 int dfs(int n,int x,int step)
 53 {
 54     int i,j,a,b,c;
 55     if(x == step)
 56         return 1;
 57     for(i = 0; i < n; i ++)
 58     {
 59         if(o[i] == 0)
 60         {
 61             if(sp[i+1] == sp[i]&&sp[i+2] == sp[i]&&o[i+1] == 0&&o[i+2] == 0)
 62             {
 63                 o[i] = 1;
 64                 o[i+1] = 1;
 65                 o[i+2] = 1;
 66                 if(dfs(n,x+1,step))
 67                     return 1;
 68                 o[i] = 0;
 69                 o[i+1] = 0;
 70                 o[i+2] = 0;
 71             }
 72             a = b = c = -1;
 73             a = i;
 74             for(j = i+1; j < n; j ++)
 75             {
 76                 if(sp[j] > sp[i] + 2) break;
 77                 if(sp[j] == sp[i] + 1&&o[j] == 0)
 78                     b = j;
 79                 if(sp[j] == sp[i] + 2&&o[j] == 0)
 80                 {
 81                     c = j;
 82                     break;
 83                 }
 84             }
 85             if(b != -1&&c != -1)
 86             {
 87                 o[a] = 1;
 88                 o[b] = 1;
 89                 o[c] = 1;
 90                 if(dfs(n,x+1,step))
 91                     return 1;
 92                 o[a] = 0;
 93                 o[b] = 0;
 94                 o[c] = 0;
 95             }
 96             break;
 97         }
 98     }
 99     return 0;
100 }
101 int main()
102 {
103     int t,i,num,j,k,u;
104     scanf("%d",&t);
105     while(t--)
106     {
107         memset(flag,0,sizeof(flag));
108         memset(ans,0,sizeof(ans));
109         for(i = 0; i < 13; i ++)
110         {
111             scanf("%s",str[i]);
112             num = str[i][0] - '0';
113             if(str[i][1] == 'm')
114                 que[i] = num;
115             else if(str[i][1] == 's')
116                 que[i] = num + 10;
117             else if(str[i][1] == 'p')
118                 que[i] = num + 20;
119             else
120                 que[i] = num*3 + 30;
121             flag[que[i]] ++;
122         }
123         sort(que,que+13);
124         judge13();
125         judge7d();
126         for(i = 0; i < 13; i ++)
127         {
128             if(que[i] == que[i+1])
129             {
130                 num = 0;
131                 for(j = 0; j < 13; j ++)
132                 {
133                     if(j == i||j == i+1) continue;
134                     p[num++] = que[j];
135                 }
136                 for(j = 0; j < 11; j ++)
137                 {
138                     for(k = j+1; k < 11; k ++)
139                     {
140                         if(p[j] == p[k])
141                         {
142                             if(flag[p[j]] == 4) continue;//特判
143                             num = 0;
144                             for(u = 0; u < 11; u ++)
145                             {
146                                 if(u == j||u == k) continue;
147                                 sp[num++] = p[u];
148                             }
149                             memset(o,0,sizeof(o));
150                             if(dfs(9,0,3))
151                             {
152                                 ans[p[j]] = 1;
153                             }
154                         }
155                         else if(p[j] + 1 == p[k])
156                         {
157                             num = 0;
158                             for(u = 0; u < 11; u ++)
159                             {
160                                 if(u == j||u == k) continue;
161                                 sp[num++] = p[u];
162                             }
163                             memset(o,0,sizeof(o));
164                             if(dfs(9,0,3))
165                             {
166                                 if(flag[p[j]-1] != 4)
167                                 ans[p[j]-1] = 1;
168                                 if(flag[p[k]+1] != 4)
169                                 ans[p[k]+1] = 1;
170                             }
171                         }
172                         else if(p[j] + 2 == p[k])
173                         {
174                             num = 0;
175                             for(u = 0; u < 11; u ++)
176                             {
177                                 if(u == j||u == k) continue;
178                                 sp[num++] = p[u];
179                             }
180                             memset(o,0,sizeof(o));
181                             if(dfs(9,0,3))
182                             {
183                                 if(flag[p[j]+1] != 4)
184                                 ans[p[j]+1] = 1;
185                             }
186                         }
187                     }
188                 }
189             }
190             if(flag[que[i]] == 4) continue;
191             num = 0;
192             for(j = 0; j < 13; j ++)
193             {
194                 if(j == i) continue;
195                 sp[num++] = que[j];
196             }
197             memset(o,0,sizeof(o));
198             if(dfs(12,0,4))
199             {
200                 ans[que[i]] = 1;
201             }
202         }
203         int fi = 0;
204         for(i = 1; i <= 9; i ++)
205             if(ans[i])fi ++;
206         for(i = 11; i <= 19; i ++)
207             if(ans[i])fi ++;
208         for(i = 21; i <= 29; i ++)
209             if(ans[i])fi ++;
210         for(i = 33; i <= 51; i ++)
211             if(ans[i]) fi ++;
212         if(fi == 0)
213             printf("Nooten\n");
214         else
215         {
216             printf("%d",fi);
217             for(i = 1; i <= 9; i ++)
218                 if(ans[i])printf(" %dm",i);
219             for(i = 11; i <= 19; i ++)
220                 if(ans[i])printf(" %ds",i-10);
221             for(i = 21; i <= 29; i ++)
222                 if(ans[i])printf(" %dp",i-20);
223             for(i = 33; i <= 51; i ++)
224                 if(ans[i])printf(" %dc",(i-30)/3);
225             printf("\n");
226         }
227     }
228     return 0;
229 }
230 /*
231 4
232 1s 1s 1s 1s 2s 2s 2s 2s 3s 3s 3s 3s 4s
233 */

转载于:https://www.cnblogs.com/naix-x/p/3448528.html

HDU 4431 Mahjong(模拟题)相关推荐

  1. HDU 4121 Xiangqi 模拟题

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=4121 首先对标题赞一个,非要叫 "Xiangqi" 而不是 "中国象棋&q ...

  2. hdu 44313391 Mahjong 枚举,判断

    hdu 4431 Mahjong 3391也是差不多的题,但是没有字牌应该简单一点. 我说这个题是一个暴力应该没什么问题,就是判断的时候非常麻烦. 题意 说说打的是日本麻将,不过好像中国的麻将也都是这 ...

  3. HDU 1262 寻找素数对 模拟题

    题目描述:输入一个偶数,判断这个偶数可以由哪两个差值最小的素数相加,输出这两个素数. 题目分析:模拟题,注意的是为了提高效率,在逐个进行判断时,只要从2判断到n/2就可以了,并且最好用打表法判断素数. ...

  4. I'm stuck! ccf模拟题。

    ccf模拟题. I'm stuck! 时间限制: 1.0s 内存限制: 256.0MB 问题描述 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S' ...

  5. 重庆社区计算机考试题库,2020重庆社区工作者考试题库:模拟题100题(64)

    2020年重庆社区工作者考试正在如火如荼的开展,为了帮助大家做好备考工作,社区工作者考试模拟题,希望考生们能与小编共同坚持--每日一练! 2020年社区工作者考试模拟题100题64 1. 在市场经济条 ...

  6. 计算机一级考试模拟题函数,2015年计算机一级考试模拟题(四)

    2015年计算机一级考试模拟题(四) 请用Word 2003对考生文件夹下WORD.DOC文档中的文字进行编辑.排版和保存,具体要求如下: (1)将标题段("十年后的家电")文字设 ...

  7. java格林认证_Java考试格林模拟题

    Java考试格林模拟题 question 14) which of the following lines of code will compile without error 1) int i=0; ...

  8. 计算机应用a级考试,四川省职称计算机应用能力考试A级模拟题

    内容简介: 四川省职称计算机应用能力考试A级模拟题 一.单选题: 1.软件工程管理是指对(C)一切活动的管理. A.软件计划期 B.高级决策层 C.软件生命期 D.软件计划和开发期 2.从一个长度为n ...

  9. 1 23 456c语言,2014年计算机二级考试C语言模拟题(1)

    2014年计算机二级考试C语言模拟题(1) 21.下列程序的运行结果为( ). #include main() {struct date {int year,month,day; }today; pr ...

最新文章

  1. nodejs的web开发框架了解一下
  2. python3 拼接字符串的7种方法
  3. jmeter多用户登录跨线程组操作传值
  4. spring依赖注入_Spring3:类型安全依赖项注入
  5. java php html,java和html的区别是什么
  6. latex 作者加小标_Latex 写期刊论文的小技巧
  7. 安装gem_Python安装第三方库及常见问题处理方法汇总
  8. gtk不是C语言的专属,c++也可以
  9. C语言实训作业PPT,C语言实训作业.docx
  10. 微信视频号的实时推荐技术架构分享
  11. matlab堆栈的思想,[转载]Matlab源代码:堆栈类Stack的实现
  12. UVA 1394 And Then There Was One 约瑟夫环数学方法
  13. Queue--队列(c语言简单实现)
  14. VBA新手教程:抽卡模拟实战(3)
  15. STM32F103如何使用串口下载程序
  16. python之window下安装python2版的pyv8库 (window install python2 pyv8)
  17. teamviewer一直验证账户_奇葩的Synchrony Bank ID验证过程(解锁Amazon Store Card)
  18. 计算机网络必看之·你确定了解应用层吗?(下)12/3最新补充
  19. 循环问“老婆,你爱我吗?”,如果回答的是“爱”, 那么就结束循环,否则就继续问。用程序描述这个故事!
  20. 如何 禁掉 Hyper-V 如何解决禁不掉 Hyper-V 的问题

热门文章

  1. LeetCode 1602. 找到二叉树中最近的右侧节点(BFS)
  2. python 全局变量、局部变量
  3. LintCode 1683. 杀怪兽(队列)
  4. 剑指Offer - 面试题40. 最小的k个数(排序/大顶堆)
  5. oracle批量联机,Oracle 12.2 使用联机重定义对表进行多处改变
  6. vim配置python开发环境_GitHub - TTWShell/legolas-vim: Vim配置,为python、go开发者打造的IDE。...
  7. redis 查看key的有效期_redis中key设置过期时间
  8. wltc循环多少公里_原来所有车都烧机油!但是烧多少才算正常你知道吗?
  9. 多线程的全局变量与局部变量
  10. 怎么在linux下使用ftp服务器,怎么在Linux下建立安全的FTP服务器?