打牌
题目描述
牌只有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。
Way1:
#include<stdio.h>
#include<string.h>
int main(){
int n;
while(scanf("%d",&n)!=EOF){
while(n--){
char str1[100],str2[100]; //定义手中牌和出牌
scanf("%s",str1);
scanf("%s",str2);
int len1=strlen(str1); //获取其大小,判断出牌的张数
int len2=strlen(str2);
int flag=0;
int y=str2[0]-'0';
if(len2==1){
for(int i=0;i<len1;i++){
int x=str1[i]-'0'; //转换为数字进行比较
if(x>y){
flag=1;
break;
}
}
}
if(len2==2){
for(int i=0;i<len1;i++){
int x=str1[i]-'0'; //转换为数字进行比较
if(x>y&&str1[i]==str1[i+1]){
flag=1;
break;
}
}
}
if(len2==3){
for(int i=0;i<len1;i++){
int x=str1[i]-'0'; //转换为数字进行比较
if(x>y&&str1[i]==str1[i+1]&&str1[i+1]==str1[i+2]){
flag=1;
break;
}
}
}
if(len2==4){
for(int i=0;i<len1;i++){
int x=str1[i]-'0'; //转换为数字进行比较
if(x>y&&str1[i]==str1[i+1]&&str1[i+1]==str1[i+2]&&str1[i+2]==str1[i+3]){
flag=1;
break;
}
}
}
if(len2==5){
for(int i=0;i<len1;i++){
int count=1;
int x=str1[i]-'0'; //转换为数字进行比较
if(x>y){ //若首个字符大于出牌的首个字符,则向后查找
for(int j=i+1;j<len1;j++){
int a=str1[j]-'0';
if(a==x+1){ //向后查找,若找到,将找到的值赋给x继续查找
x=a;
count++;
}
if(count==5) break;//查找到5张牌,结束
}
if(count==5){
flag=1;
break;
}
}
}
printf(flag?"YES\n":"NO\n");
}
}
}
return 0;
}
Way2:
#include<stdio.h>
#include<string.h>
int main()
{
char a[100]; //手中牌
char b[100]; //出牌
while(scanf("%s%s",a,b)!=EOF)
{
int length1=strlen(a);
int length2=strlen(b);
bool bol[100]; //对每张牌若大于一进行标记
int size[100]; //统计每张牌的个数
for(int i=0;i<100;i++)
{
size[i]=0;
bol[i]=false;
}
for(int i=0;i<length1;i++)
{
size[a[i]-'0']++;
bol[a[i]-'0']=true;
}
int k=0;
switch(length2)
{
case 1:for(int i=0;i<10;i++)
{
if(size[i]>=1&&i>b[0]-'0')
{
k=1;
}
}
break;
case 2:for(int i=0;i<10;i++)
{
if(size[i]>=2&&i>b[0]-'0')
{
k=1;
}
}
break;
case 3:for(int i=0;i<10;i++)
{
if(size[i]>=3&&i>b[0]-'0')
{
k=1;
}
}
break;
case 4:for(int i=0;i<10;i++)
{
if(size[i]>=4&&i>b[0]-'0')
{
k=1;
}
}
break;
case 5:
for(int i=0;i<=5;i++)
{
int j=b[0]-'0';
if(i>j&&bol[i]&&bol[i+1]&&bol[i+2]&&bol[i+3]&&bol[i+4])//若有连续的5张牌
{
k=1;
}
}
break;
default:
break;
}
if(k==1)
printf("YES\n");
if(k==0)
printf("NO\n");
}
return 0;
}