1607 - 打牌
牌只有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。
输入/输出样例
题目输入
123456789 22 123455789 33 2345678 34567
题目输出
NO YES YES
C语言解答
#include<stdio.h> #include<string.h> int judge(char *a,char *b,int l) { int i,j,d,k; d=strlen(a); k=0; for(i=0;i<d;i++) { if(a[i]>b[0]) { for(j=i;a[j]==a[i];j++) k++; if(k>=l) { return 1; break; } else { k=0; i=j-1; } } } return 0; } int judge1(char *a,char *b) { int i,l,d,k; d=0; l=strlen(a); for(i=0;i<l;i++) { if(a[i]>b[0]) { d++; for(k=i+1;k<l;k++) { if(a[k]-a[k-1]==1) d++; } if(d>=5) { return 1; break; } else { d=0; } } } return 0; } int main() { char a[101],b[101]; int h,l; while(scanf("%s",&a)!=EOF) { scanf("%s",&b); l=strlen(b); if(l<5) h=judge(a,b,l); else h=judge1(a,b); if(h==1) printf("YES\n"); else printf("NO\n"); } return 0; }
C++解答
#include<stdio.h> #include<string.h> char a[111],b[111]; void run() { int c[11],i,j,n,m;//数组c记录自己持有各种牌的张数,以便检索。 n=strlen(a)-1; for(i=1;i<=9;i++) c[i]=0; for(i=0;i<=n;i++) c[a[i]-'0']++; m=strlen(b); if(m<=4) { for(i=b[0]-'0'+1;i<=9;i++) if(c[i]>=m)//在自己手里找m张相同的牌 { printf("YES\n"); return; } printf("NO\n"); return; } else { for(i=b[0]-'0'+1;i<=5;i++) if((c[i]>=1)&&(c[i+1]>=1)&&(c[i+2]>=1)&&(c[i+3]>=1)&&(c[i+4]>=1))//找顺子 { printf("YES\n"); return; } printf("NO\n"); return; } } int main() { scanf("%s%s",a,b); while(strcmp(a,"")!=0) { run(); strcpy(a,""); scanf("%s%s",a,b); } } //无论是多少张,别人打出的牌的大小只与b[0]有关,也就是说在长度和b[0]确定时,牌是确定的。