[每日一題]71:撲克牌大小

題目描述

撲克牌遊戲大家應該都比較熟悉了,一副牌由54張組成,含3~A,2各4張,小王1張,大王1張。牌面從小到大用如下字符和字符串表示(其中,小寫joker表示小王,大寫JOKER表示大王)
3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER
輸入兩手牌,兩手牌之間用“-”連接,每手牌的每張牌以空格分隔,“-”兩邊沒有空格,如:4 4 4 4-joker JOKER
請比較兩手牌大小,輸出較大的牌,如果不存在比較關係則輸出ERROR

基本規則:
(1)輸入每手牌可能是個子,對子,順子(連續5張),三個,炸彈(四個)和對王中的一種,不存在其他情況,由輸入保證兩手牌都是合法的,順子已經從小到大排列;
(2)除了炸彈和對王可以和所有牌比較之外,其他類型的牌只能跟相同類型的存在比較關係(如,對子跟對子比較,三個跟三個比較),不考慮拆牌情況(如:將對子拆分成個子)
(3)大小規則跟大家平時瞭解的常見規則相同,個子,對子,三個比較牌面大小;順子比較最小牌大小;炸彈大於前面所有的牌,炸彈之間比較牌面大小;對王是最大的牌;
(4)輸入的兩手牌不會出現相等的情況。

答案提示:
(1)除了炸彈和對王之外,其他必須同類型比較。
(2)輸入已經保證合法性,不用檢查輸入是否是合法的牌。
(3)輸入的順子已經經過從小到大排序,因此不用再排序了.

輸入描述:

輸入兩手牌,兩手牌之間用“-”連接,每手牌的每張牌以空格分隔,“-”兩邊沒有空格,如4 4 4 4-joker JOKER。

輸出描述:

輸出兩手牌中較大的那手,不含連接符,撲克牌順序不變,仍以空格隔開;如果不存在比較關係則輸出ERROR。

示例1:

輸入
4 4 4 4-joker JOKER

輸出
joker JOKER

思路

本題的意思是輸入的只是這些類型中的一種,個子,對子,順子(連續5張),三個,炸彈(四個)和對王。其實就是最多5張牌(順子),最少1一張牌之間的比較。不存在其他情況。

由輸入保證兩手牌都是合法的,順子已經從小到大排列,按照題意牌面類型的確定和大小的比較直接可以轉換爲牌個數的比較。

解答代碼

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main() {
	string line;
	while (getline(cin, line)) {
		//王炸最大,直接輸出
		if (line.find("joker JOKER") != -1)
			cout << "joker JOKER" << endl;
		else {
			int dash = line.find('-');
			//分開兩手牌
			string car1 = line.substr(0, dash);		// 從line[0]開始,往後走dash個
			string car2 = line.substr(dash + 1);	

			// 獲取空格的次數,牌數爲c + 1
			int c1 = count(car1.begin(), car1.end(), ' ');
			int c2 = count(car2.begin(), car2.end(), ' '); 

			//拿到第一張牌
			string first1 = car1.substr(0, car1.find(' '));
			string first2 = car2.substr(0, car2.find(' '));
			string str = "345678910JQKA2jokerJOKER";

			if (c1 == c2) {
				//只要牌數相等,則第一張牌大的即爲大
				if (str.find(first1) > str.find(first2))
					cout << car1 << endl;
				else
					cout << car2 << endl;
			}
			else
			{
				//牌數不相同,說明類型不同,只有炸彈可以和其它牌比較 
				//其它類型都是錯誤的
				if (c1 == 3)
					cout << car1 << endl;
				else if (c2 == 3)
					cout << car2 << endl;
				else
					cout << "ERROR" << endl;
			}
		}
	}
	return 0;
}

如有不同見解,歡迎留言討論~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章