北邮的题出的很有水平!很难,很有挑战!这题我用了一个小时!
题目描述
牌只有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
#include <bits/stdc++.h>
using namespace std;
int main()
{
char s1[100],s2[100],ch;
int i,j,len,cn,flag;
while(cin>>s1>>s2)
{
flag=0;
len=strlen(s2);
/*找到一个比S2[0]大的就OK啦*/
if(len==1)
{
for(i=0;s1[i]!='\0';i++)
if(s1[i]>s2[0])
{
cout<<"YES"<<endl;
flag=1;
break;//输出完就及时退出!
}
if(flag==0)
{
cout<<"NO"<<endl;
continue;
}
}
/*先找与没有两个相同的,如果有,看是不是大于S2[0],否则就继续找直到尽头*/
if(len==2)
{
flag=0;
cn=1;//至少得有一个把,即单身
sort(s2,s2+len);//对S2进行升序
for(i=1;s1[i]!='\0';i++)
{
if(s1[i]==s1[i-1])//如果有相同的,就cn++
cn++;
else
cn=1;//不相同就说明已经断了,此时cn复位为1
if(cn==2)//有两个相同的了,就开始判断是否一样
if(s1[i]>s2[0])
{
cout<<"YES"<<endl;
flag=1;
break;//输出完就break
}
}
if(flag==0)
{
cout<<"NO"<<endl;
continue;
}
}
/*同2*/
if(len==3)
{
flag=0;
cn=1;
sort(s2,s2+len);
for(i=1;s1[i]!='\0';i++)
{
if(s1[i]==s1[i-1])
cn++;
else
cn=1;
if(cn==3)
if(s1[i]>s2[0])
{
cout<<"YES"<<endl;
flag=1;
break;
}
}
if(flag==0)
{
cout<<"NO"<<endl;
continue;
}
}
/*同3*/
if(len==4)
{
flag=0;
cn=1;
sort(s2,s2+len);
for(i=1;s1[i]!='\0';i++)
{
if(s1[i]==s1[i-1])
cn++;
else
cn=1;
if(cn==4)
if(s1[i]>s2[0])
{
cout<<"YES"<<endl;
flag=1;
break;
}
}
if(flag==0)
{
cout<<"NO"<<endl;
continue;
}
}
/*这个比较复杂,也是从S1中找5个连续的数,然后看顺子中最大的哪一个大不大于S2[len-1]*/
if(len==5)
{
flag=0;
cn=1;//连续的数至少一个,即单身
sort(s1,s1+strlen(s1));
sort(s2,s2+len);
if(s2[len-1]=='9')//如果S2是56789,打不过,直接投降
{
cout<<"NO"<<endl;
continue;
}
for(i=1;s1[i]!='\0';i++)//不然,就找顺子
{
if(s1[i]-s1[i-1]==1)//如果后一个比前一个大1,cn++
cn++;
if(s1[i]==s1[i-1])//前后一样就啥也不做
continue;
if(s1[i]-s1[i-1]>1)//如果>2,即突变,说明就断了,此时cn复位为1
cn=1;
if(cn>=5)//为什么这里不能写cn==5呢?因为如果这样写的话,如果S1是123456789,那么就会卡在12345这里动弹不得,后面的没有机会展示
if(s1[i]>s2[len-1])//如果大于,就说明能打赢
{
cout<<"YES"<<endl;
flag=1;
break;
}
}
if(flag==0)
{
cout<<"NO"<<endl;
continue;
}
}
}
}