天天看點

北郵機試題目---打牌

題目描述

牌隻有1到9,手裡拿着已經排好序的牌a,對方出牌b,用程式判斷手中牌是否能夠壓過對方出牌。  規則:出牌牌型有5種   [1]一張 如4 則5...9可壓過 [2]兩張 如44 則55,66,77,...,99可壓過 [3]三張 如444 規則如[2] [4]四張 如4444 規則如[2] [5]五張 牌型隻有12345 23456 34567 45678 56789五個,後面的比前面的均大。

輸入描述:

輸入有多組資料。
每組輸入兩個字元串(字元串大小不超過100)a,b。a字元串代表手中牌,b字元串代表對方出的牌。
           

輸出描述:

壓過輸出YES 否則NO。
           

示例1

輸入

12233445566677

33

輸出

YES

解題思路

本題看懂題目後其實很簡單,無非就是判斷自己的牌能否壓過對面,分兩種情況,如果出牌數小于5,則隻要存在大于對方的牌,且該牌數目大于等于對方的牌數即可,如果出牌數等于5,則需要存在大于對方首張大小的牌,且從該張牌開始,連着5張都要至少有一張。這裡有個很常用的程式設計技巧,就是用一個數組來存儲各個牌的數目,隻要掌握該技巧,解此題so easy,貼出代碼供大家參考。

#include<iostream>
using namespace std;
int main(){
	string a,b;
	cin>>a>>b;
	int lenb=b.length();
	int num[10];
	bool win=false;
	for(int i=0;i<10;i++){
		num[i]=0;
	}
	for(int i=0;i<a.length();i++){			//統計手中牌的情況,存至num數組 
		num[a.at(i)-'0']++;
	}
	if(lenb<5){
		for(int i=b.at(0)-'0'+1;i<10;i++){
			if(num[i]>=lenb){
				win=true;
			}
		}
	}else{
		for(int i=b.at(0)-'0'+1;i<6;i++){
			if(num[i]!=0 && num[i+1]!=0 && num[i+2]!=0 
			&& num[i+3]!=0 && num[i+4]!=0){
				win=true;
			}
		}
	}
	if(win){
		cout<<"YES";
	}else{
		cout<<"NO";
	}
}
           

總結 

隻用了一個技巧,就是将牌的個數存到一個num數組,差不多問題就解決了。

繼續閱讀