一樣是同窗發過來的題目,作了下,代碼以下css
描述:
計算麻將的番數
麻將遊戲愈來愈受到你們喜好,也在網絡上盛行。本題目是給定一組已經和牌的麻將,編寫一個函數計算這組麻將的番數。爲簡化題目,假設麻將只有筒子和條子兩種花型,能翻番的規則也只有如下三種,當一組牌中沒有下述三種狀況中的一種或多種,則這組牌爲0番,每種番數是加的關係,例如一組牌既有卡2條又有四歸一,則番數爲3番。
1.卡2條爲一番,即有一局牌是 1條2條3條;
2.四歸一爲兩番,即有4張同樣的牌(花色和數字都同樣);
3.巧七對爲兩番,即一組牌剛好是7對牌;
一些約定:
1.一組已經和牌的麻將由多局牌組成,一局牌能夠是一對牌、3張連續一樣花色的牌、3張同樣的牌、4張同樣的牌。
2.一組已經和牌通常有14張牌,最多能夠有18張牌(當有四歸一的時候)。
輸入:
一字符串表示已經和牌的麻將(由輸入者保證,編程人員無需考慮沒有和牌),如1T2T3T,4T5T6T,7T8T9T,1D2D3D,4D4D.
說明:
1.」1T」表示1條,T表示條子,前面跟數字幾表示幾條,數據範圍1~9,輸入者保證,編程無需考慮輸入規範性;
2.」4D」表示4筒,D表示筒子,前面跟數字幾表示幾筒,數據範圍是1~9, 輸入者保證,編程無需考慮輸入規範性;
3.每局牌之間由’,’隔開,輸入者保證每局牌都是正確的且按照數字由小到大排序,編程人員無需判斷每局牌的正確性;
4.一組牌以’.’號結束,由輸入者保證,編程人員無需考慮是否有」.」號。
5.輸入保證有番數的牌在一局中,編程人員無需考慮排序,即有番數的牌不會分散在多局牌中。
輸出:
麻將的番數,整型類型。
樣例輸入:
1T2T3T,4T5T6T,7T8T9T,1D2D3D,4D4D.
樣例輸出:
1
答案提示:
只輸出番數,且爲整型。html
#include<iostream> #include<set> #include<map> #include<string> using namespace std; int main() { string input; //存放輸入 set<string> temp; //存放不同的局數,用於計算既有巧7對又有4歸1狀況 multimap<int,string> all_ju;//用於存放每局牌長度和對應局牌狀況,例如 <4,"1T1T">,而且multimap會自動按照局牌的長度排序 cin>>input; input = input + ","; //加入尾部逗號,方便截取最後一局牌 int size = input.length(); /*先從輸入中獲取每局牌*/ for(int i=0;i< size;i++) { int locat = input.find(",",i); cout<<"位置:"<<locat<<":"; //測試用 if(locat < size) { string ju; if(locat == size-1) ju = input.substr(i,locat-i-1);//這裏要注意跳過末尾的「.」 else ju = input.substr(i,locat-i); cout<<ju<<endl; //輸出局牌,用於測試 all_ju.insert(pair<int,string>(ju.length(),ju)); temp.insert(ju); i = locat; } } int result = 0; cout<<"局數"<<all_ju.size()<<endl; /*第一種狀況是巧7對,只有巧7對的局數爲7,其餘狀況局數爲5,而且巧7對可能包含4歸1狀況,例如1T1T,1T1T,2T2T,3T3T,4T4T,5T5T,6T6T. 此時蕃數爲4*/ if(all_ju.size() == 7) { multimap<int,string>::iterator it = all_ju.begin(); it++; if((*it).first == 4) result = result + 2 + 2*(7-temp.size()); cout<<result<<endl; } /*第二種狀況是卡2條,而且可能含有4歸一狀況,局數確定是5*/ else if(all_ju.size() == 5) { multimap<int,string>::iterator id = all_ju.end(); id--; /*第一個確定是1對狀況,不須要遍歷,剩下的從後往前遍歷,已經按照每局牌的長度排過續,那若是有4歸1,確定是在最後幾個,且長度爲8*/ for(;id!=all_ju.begin();id--) { if((*id).first == 8) result += 2; else{ string mid = (*id).second.substr(2,2); if(mid == "2T") result += 1; } } cout<<result<<endl; //輸出蕃數 } return 0; }