TYVJ P1092 麻将

题目:

http://tyvj.cn/Problem_Show.asp?id=1092

 

题解:

  不解释………………自己去看代码吧……………………

 

View Code
  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cstring>
  4 
  5 using namespace std;
  6 
  7 int num[10][20],num2[10][20],t;
  8 
  9 char s[40];
 10 
 11 bool dfs(int now)
 12 {
 13     if (now==5)
 14     {
 15         for (int a=1;a<=3;a++)
 16             for (int b=1;b<=9;b++)
 17                 if (num[a][b]!=0)
 18                 {
 19                     if (num[a][b]!=2) return false;
 20                 }
 21         return true;
 22     }
 23     for (int a=1;a<=3;a++)
 24         for (int b=1;b<=9;b++)
 25             if (num[a][b]!=0)
 26             {
 27                 if (num[a][b+1]!=0 && num[a][b+2]!=0)
 28                 {
 29                     num[a][b]--;
 30                     num[a][b+1]--;
 31                     num[a][b+2]--;
 32                     if (dfs(now+1))
 33                     {
 34                         num[a][b]++;
 35                         num[a][b+1]++;
 36                         num[a][b+2]++;
 37                         return true;
 38                     }
 39                     num[a][b]++;
 40                     num[a][b+1]++;
 41                     num[a][b+2]++;
 42                 }
 43                 if (num[a][b]>=3)
 44                 {
 45                     num[a][b]-=3;
 46                     if (dfs(now+1))
 47                     {
 48                         num[a][b]+=3;
 49                         return true;
 50                     }
 51                     num[a][b]+=3;
 52                 }
 53             }
 54     return false;
 55 }
 56 
 57 bool check()//检查是否能和
 58 {
 59     return dfs(1);
 60 }
 61 
 62 int work1()//平和(一番):4个顺子组成
 63 {
 64     for (int a=1;a<=3;a++)
 65         for (int b=1;b<=9;b++)
 66             if (num[a][b]>=2)
 67             {
 68                 for (int c=1;c<=3;c++)
 69                     for (int d=1;d<=9;d++)
 70                         num2[c][d]=num[c][d];
 71                 num2[a][b]-=2;
 72                 bool able=true;
 73                 for (int c=1;c<=3;c++)
 74                 {
 75                     if (!able) break;
 76                     for (int d=1;d<=9;d++)
 77                         if (num2[c][d]!=0)
 78                         {
 79                             if (num2[c][d+1]==0 || num2[c][d+2]==0)
 80                             {
 81                                 able=false;
 82                                 break;
 83                             }
 84                             num2[c][d]--;
 85                             num2[c][d+1]--;
 86                             num2[c][d+2]--;
 87                             d--;
 88                         }
 89                 }
 90                 if (able) return 1;
 91             }
 92     return 0;
 93 }
 94 
 95 int work2()//断幺九(一番):胡牌的时候手上只有2-8的数字组成的牌型
 96 {
 97     if (num[1][1] || num[2][1] || num[3][1] || num[1][9] || num[2][9] || num[3][9]) return 0;
 98     else return 1;
 99 }
100 
101 int work3()//一杯口(一番):同花色同数值的顺子两组
102 {
103     for (int a=1;a<=3;a++)
104         for (int b=1;b<=9;b++)
105             if (num[a][b]>=2)
106             {
107                 for (int c=1;c<=3;c++)
108                     for (int d=1;d<=9;d++)
109                         num2[c][d]=num[c][d];
110                 num2[a][b]-=2;
111                 bool able=true;
112                 for (int c=1;c<=3;c++)
113                 {
114                     if (!able) break;
115                     for (int d=1;d<=9;d++)
116                         if (num2[c][d]!=0)
117                         {
118                             if (num2[c][d]>=2 && num2[c][d+1]>=2 && num2[c][d+2]>=2) return 1;
119                             if (num2[c][d+1]==0 || num2[c][d+2]==0)
120                             {
121                                 able=false;
122                                 break;
123                             }
124                             num2[c][d]--;
125                             num2[c][d+1]--;
126                             num2[c][d+2]--;
127                             d--;
128                         }
129                 }
130             }
131     return 0;
132 }
133 
134 bool dfs2(int now)
135 {
136     if (now==5) return true;
137     for (int a=1;a<=3;a++)
138         for (int b=1;b<=9;b++)
139             if (num2[a][b]!=0)
140             {
141                 if (num2[a][b+1]!=0 && num2[a][b+2]!=0 && (b==1 || b+2==9))
142                 {
143                     num2[a][b]--;
144                     num2[a][b+1]--;
145                     num2[a][b+2]--;
146                     if (dfs2(now+1)) return true;
147                     num2[a][b]++;
148                     num2[a][b+1]++;
149                     num2[a][b+2]++;
150                 }
151                 if (num2[a][b]>=3 && (b==1 || b==9))
152                 {
153                     num2[a][b]-=3;
154                     if (dfs2(now+1)) return true;
155                     num2[a][b]+=3;
156                 }
157             }
158     return false;
159 }
160 
161 int work4()//混全带幺九(一番):全部的顺子,刻子中都含有数字1或9
162 {
163     for (int a=1;a<=3;a++)
164         for (int b=1;b<=9;b++)
165             if (num[a][b]>=2)
166             {
167                 for (int c=1;c<=3;c++)
168                     for (int d=1;d<=9;d++)
169                         num2[c][d]=num[c][d];
170                 num2[a][b]-=2;
171                 if (dfs2(1)) return 1;
172             }
173     return 0;
174 }
175 
176 int work5()//三色同顺(一番):三种花色同数值的顺子各一组
177 {
178     for (int a=1;a<=3;a++)
179         for (int b=1;b<=9;b++)
180             if (num[a][b]>=2)
181             {
182                 for (int c=1;c<=3;c++)
183                     for (int d=1;d<=9;d++)
184                         num2[c][d]=num[c][d];
185                 num2[a][b]-=2;
186                 for (int c=1;c<=9;c++)
187                     if (num2[1][c] && num2[2][c] && num2[3][c] && num2[1][c+1] && num2[2][c+1] && num2[3][c+1] && num2[1][c+2] && num2[2][c+2] && num2[3][c+2])
188                     {
189                         num2[1][c]--;num2[1][c+1]--;num2[1][c+2]--;
190                         num2[2][c]--;num2[2][c+1]--;num2[2][c+2]--;
191                         num2[3][c]--;num2[3][c+1]--;num2[3][c+2]--;
192                         bool able,find=false;
193                         for (int c=1;c<=3;c++)
194                         {
195                             if (find) break;
196                             for (int d=1;d<=9;d++)
197                                 if (num2[c][d]!=0)
198                                 {
199                                     find=true;
200                                     if (num2[c][d]==3) able=true;
201                                     else
202                                     {
203                                         if (num2[c][d]==1 && num2[c][d+1]==1 && num2[c][d+2]==1) able=true;
204                                         else able=false;
205                                     }
206                                     break;
207                                 }
208                         }
209                         if (able) return 1;
210                     }
211             }
212     return 0;
213 }
214 
215 int work6()//一气贯通(一番):由同花色一至九组成顺子
216 {
217     for (int a=1;a<=3;a++)
218         for (int b=1;b<=9;b++)
219             if (num[a][b]>=2)
220             {
221                 for (int c=1;c<=3;c++)
222                     for (int d=1;d<=9;d++)
223                         num2[c][d]=num[c][d];
224                 num2[a][b]-=2;
225                 for (int c=1;c<=3;c++)
226                     if (num2[c][1] && num2[c][2] && num2[c][3] && num2[c][4] && num2[c][5] && num2[c][6] && num2[c][7] && num2[c][8] && num2[c][9])
227                     {
228                         num2[c][1]--;
229                         num2[c][2]--;
230                         num2[c][3]--;
231                         num2[c][4]--;
232                         num2[c][5]--;
233                         num2[c][6]--;
234                         num2[c][7]--;
235                         num2[c][8]--;
236                         num2[c][9]--;
237                         bool able=false,find=false;
238                         for (int d=1;d<=3;d++)
239                         {
240                             if (find) break;
241                             for (int e=1;e<=9;e++)
242                                 if (num2[d][e]!=0)
243                                 {
244                                     find=true;
245                                     if (num2[d][e]==3) able=true;
246                                     else
247                                     {
248                                         if (num2[d][e+1]==1 && num2[d][e+2]==1) able=true;
249                                         else able=false;
250                                     }
251                                     break;
252                                 }
253                         }
254                         if (able) return 1;
255                     }
256             }
257     return 0;
258 }
259 
260 int work7()//一色三顺(两番):同花色同数值顺子三组
261 {
262     for (int a=1;a<=3;a++)
263         for (int b=1;b<=9;b++)
264             if (num[a][b]>=2)
265             {
266                 for (int c=1;c<=3;c++)
267                     for (int d=1;d<=9;d++)
268                         num2[c][d]=num[c][d];
269                 num2[a][b]-=2;
270                 for (int c=1;c<=3;c++)
271                     for (int d=1;d<=9;d++)
272                         if (num2[c][d]>=3 && num2[c][d+1]>=3 && num2[c][d+2]>=3)
273                         {
274                             num2[c][d]-=3;
275                             num2[c][d+1]-=3;
276                             num2[c][d+2]-=3;
277                             bool able=false,find=false;
278                             for (int d=1;d<=3;d++)
279                             {
280                                 if (find) break;
281                                 for (int e=1;e<=9;e++)
282                                     if (num2[d][e]!=0)
283                                     {
284                                         find=true;
285                                         if (num2[d][e]==3) able=true;
286                                         else
287                                         {
288                                             if (num2[d][e+1]==1 && num2[d][e+2]==1) able=true;
289                                             else able=false;
290                                         }
291                                         break;
292                                     }
293                             }
294                             if (able) return 2;
295                         }
296             }
297     return 0;
298 }
299 
300 int work8()//对对和(两番):四组刻子
301 {
302     for (int a=1;a<=3;a++)
303         for (int b=1;b<=9;b++)
304             if (num[a][b]>=2)
305             {
306                 for (int c=1;c<=3;c++)
307                     for (int d=1;d<=9;d++)
308                         num2[c][d]=num[c][d];
309                 num2[a][b]-=2;
310                 bool able=true;
311                 for (int c=1;c<=3;c++)
312                     for (int d=1;d<=9;d++)
313                         if (num2[c][d]!=0)
314                         {
315                             if (num2[c][d]!=3) able=false;
316                         }
317                 if (able) return 2;
318             }
319     return 0;
320 }
321 
322 int work9()//两杯口(三番):由两组不同的一杯口组成
323 {
324     for (int a=1;a<=3;a++)
325         for (int b=1;b<=9;b++)
326             if (num[a][b]>=2)
327             {
328                 for (int c=1;c<=3;c++)
329                     for (int d=1;d<=9;d++)
330                         num2[c][d]=num[c][d];
331                 num2[a][b]-=2;
332                 bool able=true,find=false;
333                 for (int c=1;c<=3;c++)
334                 {
335                     if (find) break;
336                     for (int d=1;d<=9;d++)
337                         if (num2[c][d]!=0)
338                         {
339                             find=true;
340                             if (num2[c][d]<2 || num2[c][d+1]<2 || num2[c][d+2]<2)
341                             {
342                                 able=false;
343                                 break;
344                             }
345                             else
346                             {
347                                 num2[c][d]-=2;
348                                 num2[c][d+1]-=2;
349                                 num2[c][d+2]-=2;
350                                 bool find=false;
351                                 for (int e=1;e<=3;e++)
352                                 {
353                                     if (find) break;
354                                     for (int f=1;f<=9;f++)
355                                         if (num2[e][f]!=0)
356                                         {
357                                             find=true;
358                                             if (e==c && f==d)
359                                             {
360                                                 able=false;
361                                                 break;
362                                             }
363                                             if (num2[e][f]!=2 || num2[e][f+1]!=2 || num2[e][f+2]!=2) able=false;
364                                             break;
365                                         }
366                                 }
367                                 break;
368                             }
369                         }
370                 }
371                 if (able) return 3;
372             }
373     return 0;
374 }
375 
376 int work10()//三色同刻(三番):三种花色同数值的刻子各一组
377 {
378     for (int a=1;a<=3;a++)
379         for (int b=1;b<=9;b++)
380             if (num[a][b]>=2)
381             {
382                 for (int c=1;c<=3;c++)
383                     for (int d=1;d<=9;d++)
384                         num2[c][d]=num[c][d];
385                 num2[a][b]-=2;
386                 for (int c=1;c<=9;c++)
387                     if (num2[1][c]>=3 && num2[2][c]>=3 && num2[3][c]>=3)
388                     {
389                         num2[1][c]-=3;
390                         num2[2][c]-=3;
391                         num2[3][c]-=3;
392                         bool able=false,find=false;
393                         for (int d=1;d<=3;d++)
394                         {
395                             if (find) break;
396                             for (int e=1;e<=9;e++)
397                                 if (num2[d][e]!=0)
398                                 {
399                                     find=true;
400                                     if (num2[d][e]==3) able=true;
401                                     else
402                                     {
403                                         if (num2[d][e+1]==1 && num2[d][e+2]==1) able=true;
404                                         else able=false;
405                                     }
406                                     break;
407                                 }
408                         }
409                         if (able) return 3;
410                     }
411             }
412     return 0;
413 }
414 
415 int work11()//清一色(六番):全部由同一种花色的顺子,刻子及雀头组成
416 {
417     for (int a=1;a<=3;a++)
418     {
419         int nowsum=0;
420         for (int b=1;b<=9;b++)
421             nowsum+=num[a][b];
422         if (nowsum==14) return 6;
423     }
424     return 0;
425 }
426 
427 int work12()//清老头(六番):全部由1或9的刻子和雀头组成
428 {
429     for (int a=1;a<=3;a++)
430         for (int b=2;b<=8;b++)
431             if (num[a][b]) return 0;
432     return 6;
433 }
434 
435 int main()
436 {
437     scanf("%d",&t);
438     for (int a=1;a<=t;a++)
439     {
440         scanf("%s",s+1);
441         memset(num,0,sizeof(num));
442         for (int a=1;a<=14;a++)
443         {
444             switch(s[a*2])
445             {
446                 case 'w':
447                     {
448                         num[1][s[a*2-1]-'0']++;
449                         break;
450                     }
451                 case 's':
452                     {
453                         num[2][s[a*2-1]-'0']++;
454                         break;
455                     }
456                 case 't':
457                     {
458                         num[3][s[a*2-1]-'0']++;
459                         break;
460                     }
461             }
462         }
463         if (!check())//检查是否能和
464         {
465             printf("0\n");
466             continue;
467         }
468         int ans=0;
469         ans+=work1();//平和(一番):4个顺子组成
470         ans+=work2();//断幺九(一番):胡牌的时候手上只有2-8的数字组成的牌型
471         ans+=work3();//一杯口(一番):同花色同数值的顺子两组
472         ans+=work4();//混全带幺九(一番):全部的顺子,刻子中都含有数字1或9
473         ans+=work5();//三色同顺(一番):三种花色同数值的顺子各一组
474         ans+=work6();//一气贯通(一番):由同花色一至九组成顺子
475         ans+=work7();//一色三顺(两番):同花色同数值顺子三组
476         ans+=work8();//对对和(两番):四组刻子
477         ans+=work9();//两杯口(三番):由两组不同的一杯口组成
478         ans+=work10();//三色同刻(三番):三种花色同数值的刻子各一组
479         ans+=work11();//清一色(六番):全部由同一种花色的顺子,刻子及雀头组成
480         ans+=work12();//清老头(六番):全部由1或9的刻子和雀头组成
481         printf("%d\n",ans);
482     }
483     return 0;
484 }

转载于:https://www.cnblogs.com/zhonghaoxi/archive/2012/07/10/2584064.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。在编写C程序时,需要注意变量的声明和定义、指针的使用、内存的分配与释放等问题。C语言中常用的数据结构包括: 1. 数组:一种存储同类型数据的结构,可以进行索引访问和修改。 2. 链表:一种存储不同类型数据的结构,每个节点包含数据和指向下一个节点的指针。 3. 栈:一种后进先出(LIFO)的数据结构,可以通过压入(push)和弹出(pop)操作进行数据的存储和取出。 4. 队列:一种先进先出(FIFO)的数据结构,可以通过入队(enqueue)和出队(dequeue)操作进行数据的存储和取出。 5. 树:一种存储具有父子关系的数据结构,可以通过中序遍历、前序遍历和后序遍历等方式进行数据的访问和修改。 6. 图:一种存储具有节点和边关系的数据结构,可以通过广度优先搜索、深度优先搜索等方式进行数据的访问和修改。 这些数据结构在C语言中都有相应的实现方式,可以应用于各种不同的场景。C语言中的各种数据结构都有其优缺点,下面列举一些常见的数据结构的优缺点: 数组: 优点:访问和修改元素的速度非常快,适用于需要频繁读取和修改数据的场合。 缺点:数组的长度是固定的,不适合存储大小不固定的动态数据,另外数组在内存中是连续分配的,当数组较大时可能会导致内存碎片化。 链表: 优点:可以方便地插入和删除元素,适用于需要频繁插入和删除数据的场合。 缺点:访问和修改元素的速度相对较慢,因为需要遍历链表找到指定的节点。 栈: 优点:后进先出(LIFO)的特性使得栈在处理递归和括号匹配等问题时非常方便。 缺点:栈的空间有限,当数据量较大时可能会导致栈溢出。 队列: 优点:先进先出(FIFO)的特性使得

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值