https://nanti.jisuanke.com/t/39612ios
題面:c++
在麻將遊戲中,有 3434 種牌,分別是 1-91−9 的萬,1-91−9 的筒,1-91−9 的條,以及 77 種字牌 「東」,「南」,「西」,「北」,「白」,「發」,「中」。 這 3434 種牌各四張,共 136136 張。 若是你手牌中湊夠了 1414 張牌,知足必定的牌型條件,就稱做「和牌」。 這個牌型有不少種,但在本題中,只考慮最基本的一種,44 個面子 + 11 個雀頭組成的牌型。 面子是刻子和順子的統稱,雀頭是對子。 刻子指的是,三張同樣的牌。 順子指的是,三張連續的牌,注意,只有非字牌(也就是萬,筒,條)才能連續,例如一二三萬,四五六筒,而且不能循環連續,好比九一二條就不算順子。 對子指的是,兩張同樣的牌。 如今,zcy 手中有 1313 張牌,而且再獲得某一張牌,就能夠和牌,而你的目標就是輸出能使 zcy 和牌的牌。 注意一種特殊狀況,若是你手牌中某張牌有四張,而再獲得這張牌也能和牌,這張牌在本題中不須要輸出,由於這張牌總共就只有四張,不可能拿到手了。 (若是你知道什麼是槓,請僞裝不能槓,若是你不知道,那就不須要知道了。)
輸入要求:ide
1−9 萬用對應數字 + 一個小寫 mm 表示 1-91−9 條用對應數字 + 一個小寫 ss 表示 1-91−9 筒用對應數字 + 一個小寫 pp 表示 東南西北白髮中分別用 1-71−7 的數字 + 一個小寫 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 }