题目描述
牌只有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。
散列表,牌型5最特殊所以单独写,使用滑动窗口5判断。牌型1234分两种情况,直接比较长度。
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int num[10]={0,0,0,0,0,0,0,0,0,0};
int Judge5(int st) //查找五型牌
{
int answer=0,left;
left=st;
while(left<6)
{
int count=5;
for(int move=left;move<10;move++)
{
if(!num[move]) //为空则此次查找失败
break; //跳出此次for循环
else
{
count--;
if(count==0) //找到了成功5型牌
{
answer=1;
break;
}
}
}
if(answer) break; //跳出while循环
else left++; //本轮查找失败 下一轮继续
}
return answer;
}
int Judge1234(int st,int len)
{
int answer=0;
for(int i=0;i<10;i++)
{
if(i<=st) //分两种情况讨论
{
if(num[i]>len)
answer=1;
}
else
{
if(num[i]>=len)
answer=1;
}
}
return answer;
}
int main()
{
string a,b;
while(getline(cin,a))
{
getline(cin,b);
for(int i=0;i<a.size();i++)
num[a[i]-'0']++;
int len_b=b.size();
int flag=0,st;
if(len_b==5) //牌型5比较特殊
{
st=b[1]-'0'; //从牌型5第二位开始查找
if(st<6)
flag=Judge5(st);
else
flag=0;
}
else //查找其它类型
{
st=b[0]-'0';
flag=Judge1234(st,len_b);
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
提交结果: