NOIP模拟赛 麻将

【题目描述】

众所周知,麻将是我们国家的国粹。这段时间,小D也迷上了麻将这个老少皆宜的游戏。
小D觉得这些不同规则的麻将太麻烦了,所以他集合了很多种麻将规则创造出了一套D麻将。下面是D麻将的几个特点:
D麻将中有三种花色,万(w)索(s)筒(t),每个花色下有9张牌,每张牌有4个。
D麻将中没有杠牌,只有顺子和刻子。顺子的含义是相同花色的三张连在一起的牌型(比如说2w3w4w);刻子的含义是三张花色和数字都相同的牌型(比如说2s2s2s)。
D麻将的胡牌的时候手上往往有14张牌,14张牌凑成了四个顺子或刻子和两张一样的牌做雀头就可以胡牌了。
D麻将胡牌的时候有很多种不同的牌型,不同的牌型会有不一样的番数。你的一种牌型可能满足了多个加番牌型,满足多个的情况下就把所有满足的牌型的番数全部加起来计算。
D麻将中有如下牌型可以加番:
平和(一番):4个顺子组成;
一杯口(一番):同花色同数值的顺子两组;
混全带幺九(一番):全部的顺子,刻子中都含有数字1或9;
三色同顺(一番):三种花色同数值的顺子各一组;
一气贯通(两番):由同花色一至九组成顺子;
对对和(两番):四组刻子;

断幺九(两番):胡牌的时候手上只有2-8的数字组成的牌型;

一色三顺(三番):同花色同数值顺子三组;
两杯口(三番):由两组不同的一杯口组成;
三色同刻(四番):三种花色同数值的刻子各一组;

清老头(五番):全部由1或9的刻子和雀头组成;
清一色(七番):全部由同一种花色的顺子,刻子及雀头组成;
比如说一个牌型为1s2s3s4s5s6s7s8s9s1s2s3s9s9s的牌,它满足了平和、一杯口、一气贯通、清一色四个牌型,所以它的番数是10番。
小D希望为D麻将做一个程序来帮忙判断这个牌型的番数是多少。

【输入格式】

输入第一行一个测试组数T。
接下来T行每行一个字符串s,表示需要判断番数的牌型。length(s)=28

【输出格式】

输出有T行每行一个整数,表示判断牌型的番数为多少。

【样例输入】

1
1s2s3s4s5s6s7s8s9s1s2s3s9s9s

【样例输出】

10

这种简单粗暴的强模拟题,上次写USACO的麻将就写的想***,这次写到一半就想吐了。。。

不行,我要留坑(弃坑)

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 
 5 int T;
 6 int mj[14],C[30];
 7 
 8 int convert(int i,char ch)
 9 {
10     int t;
11     switch(ch)
12     {
13         case 'w':
14             t=0;
15             break;
16         case 's':
17             t=9;
18             break;
19         case 't':
20             t=18;
21     }
22     return t+i;
23 }
24 
25 bool work1(int dep)
26 {
27     for(int i=0;i<=18;i+=9)
28         for(int j=1;j<=7;j++)
29         {
30             if(C[i+j]>0&&C[i+j+1]>0&&C[i+j+2]>0)
31             {
32                 if(dep>=3) return true;
33                 C[i+j]--;C[i+j+1]--;C[i+j+2]--;
34                 if(pinghe(dep+1)) return true;
35                 C[i+j]++;C[i+j+1]++;C[i+j+2]++;
36             }
37         }
38     return false;
39 }
40 
41 bool work2()
42 {
43     for(int i=1;i<=7;i++)
44     {
45         if(C[i]>0&&C[i+1]>0&&C[i+2]>0&&C[i+9]>0&&C[i+9+1]>0&&C[i+9+2]>0) return true;
46         if(C[i]>0&&C[i+1]>0&&C[i+2]>0&&C[i+18]>0&&C[i+18+1]>0&&C[i+18+2]>0) return true;
47         if(C[i+9]>0&&C[i+9+1]>0&&C[i+9+2]>0&&C[i+18]>0&&C[i+18+1]>0&&C[i+18+2]>0) return true;
48     }
49     return false;
50 }
51 
52 bool work3()
53 {
54 
55 }
56 
57 int main()
58 {
59     cin>>T;
60     while(T--)
61     {
62         int n;char ch;
63         memset(C,0,sizeof(C));
64         for(int i=0;i<14;i++)
65         {
66             scanf("%d%c",&n,&ch);
67             mj[i]=convert(n,ch);
68         }
69         for(int i=0;i<14;i++)
70             C[mj[i]]++;
71     }
72     return 0;
73 }
原文地址:https://www.cnblogs.com/InWILL/p/6013861.html