题目
牌只有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:纯列举
超级好理解,根据打牌过程直接翻译,但是也很麻烦,有很多重复代码以及不必要的计算
#include<iostream>
#include<string>
using namespace std;
int main()
{
string a,b;
cin>>a>>b;
int flag=0;
switch(b.length())
{
//一张牌:找一个比b大的则YES
case 1:
for(int i=0;i<a.length();i++)
{
if(a[i]>b[0])
{
flag=1;
break;
}
}
break;
//两张牌:找两个连续比b[0]大的则YES
case 2:
for(int i=0;i<a.length();i++)
{
if(i<a.length()-1&&a[i]>b[0])
{
if(a[i+1]==a[i])
{
flag=1;
break;
}
}
}
break;
//三张牌:找三个连续比b[0]大的则YES
case 3:
for(int i=0;i<a.length();i++)
{
if(i<a.length()-2&&a[i]>b[0])
{
if(a[i+2]==a[i]&&a[i+1]==a[i])
{
flag=1;
break;
}
}
}
break;
//四张牌:找四个连续比b[0]大的则YES
case 4:
for(int i=0;i<a.length();i++)
{
if(i<a.length()-3&&a[i]>b[0])
{
if(a[i+3]==a[i]&&a[i+2]==a[i]&&a[i+1]==a[i])
{
flag=1;
break;
}
}
}
break;
//五张牌:加入b是23456,则在a里找34567/45678/56789,找到一个则YES
case 5:
int count=0;
//a里有个数是b[0]+1
if(a.find(b[0]+1)!=a.npos)
{
if(a.find(b[0]+2)!=a.npos&&a.find(b[0]+3)!=a.npos&&a.find(b[0]+4)!=a.npos&&a.find(b[0]+5)!=a.npos)
{
flag=1;
break;
}
}
//没有b[0]+1,但有b[0]+2
else if(a.find(b[0]+2)!=a.npos)
{
if(a.find(b[0]+3)!=a.npos&&a.find(b[0]+4)!=a.npos&&a.find(b[0]+5)!=a.npos&&a.find(b[0]+6)!=a.npos)
{
flag=1;
break;
}
}
else if(a.find(b[0]+3)!=a.npos)
{
if(a.find(b[0]+4)!=a.npos&&a.find(b[0]+5)!=a.npos&&a.find(b[0]+6)!=a.npos&&a.find(b[0]+7)!=a.npos)
{
flag=1;
break;
}
}
else if(a.find(b[0]+4)!=a.npos)
{
if(a.find(b[0]+5)!=a.npos&&a.find(b[0]+6)!=a.npos&&a.find(b[0]+7)!=a.npos&&a.find(b[0]+8)!=a.npos)
{
flag=1;
break;
}
}
else if(a.find(b[0]+5)!=a.npos)
{
if(a.find(b[0]+6)!=a.npos&&a.find(b[0]+7)!=a.npos&&a.find(b[0]+8)!=a.npos&&a.find(b[0]+9)!=a.npos)
{
flag=1;
break;
}
}
break;
}
if(flag)
cout<<"YES";
else
cout<<"NO";
}
法2:用桶
用桶记录a拥有的每种牌的数量,再根据b出的牌到对应的桶中去找a有没有可以压过b的牌
#include<iostream>
#include<string>
using namespace std;
int main()
{
string a,b;
cin>>a>>b;
int flag=0;
int card[10]={
0};
//牌的数量装桶
for(int i=0;i<a.length();i++)
{
card[a[i]-'0']++;//一定别忘了a[i]转成int型
}
//1~4张牌情况
if(b.length()<5)
{
for(int i=b[0]+1-'0';i<10;i++)
{
if(card[i]>=b.length())
{
flag=1;//能压过
break;
}
}
}
//5张牌情况
else
{
for(int j=1;j<5;j++)
{
int i;
for(i=b[0]+j-'0';i<b[0]+j+5-'0'&&i<10;i++)
{
if(!card[i])
break;
}
if(i<10&&i==b[0]+j+5-'0')
{
flag=1;
break;
}
}
}
if(flag)
cout<<"YES";
else
cout<<"NO";
}
注意:不要忘记访问a的牌string a
时,把char转成int,即a[i]-'0'