簡單的打麻將!!!!

https://nanti.jisuanke.com/t/39612ios

題面:c++

在麻將遊戲中,有 3434 種牌,分別是 1-919 的萬,1-919 的筒,1-919 的條,以及 77 種字牌 「東」,「南」,「西」,「北」,「白」,「發」,「中」。

這 3434 種牌各四張,共 136136 張。

若是你手牌中湊夠了 1414 張牌,知足必定的牌型條件,就稱做「和牌」。

這個牌型有不少種,但在本題中,只考慮最基本的一種,44 個面子 + 11 個雀頭組成的牌型。

面子是刻子和順子的統稱,雀頭是對子。

刻子指的是,三張同樣的牌。

順子指的是,三張連續的牌,注意,只有非字牌(也就是萬,筒,條)才能連續,例如一二三萬,四五六筒,而且不能循環連續,好比九一二條就不算順子。

對子指的是,兩張同樣的牌。

如今,zcy 手中有 1313 張牌,而且再獲得某一張牌,就能夠和牌,而你的目標就是輸出能使 zcy 和牌的牌。

注意一種特殊狀況,若是你手牌中某張牌有四張,而再獲得這張牌也能和牌,這張牌在本題中不須要輸出,由於這張牌總共就只有四張,不可能拿到手了。

(若是你知道什麼是槓,請僞裝不能槓,若是你不知道,那就不須要知道了。)

輸入要求:ide

19 萬用對應數字 + 一個小寫 mm 表示

​1-919 條用對應數字 + 一個小寫 ss 表示

​1-919 筒用對應數字 + 一個小寫 pp 表示

​東南西北白髮中分別用 1-717 的數字 + 一個小寫 zz 表示

​輸入多組數據,每組共 1313 個數字 + 字母的組合,用空格隔開

​輸入保證有解

輸入格式:spa

對於每組數據,輸出若干行,每行一個聽牌,按照萬,條,筒,字的順序輸出聽牌,同類型按照數從小到大輸出

數據組數不超過 1010

輸入案例:code

1s 2s 3s 4s 5s 6s 7s 8s 9s 1z 1z 3p 4p

輸出案例:blog

2p
5p

思路:遊戲

胡牌是這樣的:
一個對子 +  4組 3個相同的牌或者順子。  只有m、s、p是能夠構成順子的。東西南北這樣的牌沒有順子。


思路:
枚舉每個對子。而後按照順序找3張相同或者順子。若是有三種相同的,構成3張相同的。沒有就看能不能和後面的構成順子。必定要按照順序從小到大找過去。 1c```7c只能構成3張同樣的。而後判斷是否是恰好找到4組。

代碼:it

  1 #include <stdlib.h>
  2 #include<iostream>
  3 #include<bits/stdc++.h>
  4 #include<cmath>
  5 #define ll long long
  6 const int INF=0x3f3f3f3f;
  7 #define mod 1000000007
  8 using namespace std;
  9 //priority_queue
 10 int cnt[35];
 11 int ant[35];
 12 int ju()
 13 { int cnt1[35];
 14     for(int i=0;i<34;i++)
 15         cnt1[i]=cnt[i];
 16         int sum=0;
 17     for(int i=0;i<=18;i+=9)
 18         for(int j=0;j<9;j++)
 19     {
 20         if(cnt1[i+j]>=3)
 21         {
 22             cnt1[i+j]-=3;
 23             sum++;
 24         }
 25         while(j+2<9&&cnt1[i+j]&&cnt1[i+j+1]&&cnt1[i+j+2])
 26         {
 27             cnt1[i+j]--;
 28             cnt1[i+1+j]--;
 29             cnt1[i+j+2]--;
 30             sum++;
 31         }
 32     }
 33     for(int i=0;i<7;i++)
 34         if(cnt1[27+i]>=3)sum++;
 35     if(sum==4)return 1;
 36     return 0;
 37 }
 38 int jug()
 39 {
 40     int cnt1[35];
 41     for(int i=0;i<34;i++)
 42         cnt1[i]=cnt[i];
 43     for(int i=0;i<34;i++)
 44     {
 45         if(cnt[i]>=2)
 46         {
 47             cnt[i]-=2;
 48             if(ju()){ cnt[i]+=2;return 1;}
 49             cnt[i]+=2;
 50         }
 51     }
 52     return 0;
 53 }
 54 struct A{
 55  int id;
 56  char ch;
 57  bool operator <(A z)
 58  {
 59      if(ch!=z.ch)return ch<z.ch;
 60      return id<z.id;
 61  }
 62 }Q[35];
 63 int main()
 64 {
 65   char s[3];
 66   while(scanf("%s",s)!=EOF)
 67   {  int t=s[0]-'1';
 68   memset(cnt,0,sizeof(cnt));
 69       if(s[1]=='m')t+=0;
 70       else if(s[1]=='s')t+=9;
 71       else if(s[1]=='p')t+=18;
 72       else t+=27;
 73       cnt[t]++;
 74       for(int i=2;i<=13;i++)
 75       {
 76           scanf("%s",s);
 77           t=s[0]-'1';
 78       if(s[1]=='m')t+=0;
 79       else if(s[1]=='s')t+=9;
 80       else if(s[1]=='p')t+=18;
 81       else t+=27;
 82       cnt[t]++;
 83       }
 84       int sum=0;
 85       for(int i=0;i<34;i++)
 86       {
 87           cnt[i]++;
 88           if(cnt[i]<=4&&jug())
 89             ant[++sum]=i;
 90           cnt[i]--;
 91       }
 92       int zzz=0;
 93       for(int i=1;i<=sum;i++)
 94         {
 95             Q[++zzz].id=ant[i]%9;
 96             if(ant[i]/9==0)Q[zzz].ch='m';
 97             else if(ant[i]/9==1)Q[zzz].ch='s';
 98             else if(ant[i]/9==2)Q[zzz].ch='p';
 99             else Q[zzz].ch='z';}
100             sort(Q+1,Q+1+zzz);
101             for(int i=1;i<=zzz;i++)
102                 cout<<Q[i].id+1<<Q[i].ch<<endl;
103   }
104 }
View Code
相關文章
相關標籤/搜索