2010北邮复试网研上机题——打牌
起因:
最*利用空余时间也练*了将*一个月的acm,重新回来看这篇当时的博客,发现代码错误百出,在九度OJ上重新ac了这道题,上代码给大家看
题目要求:
-
牌只有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。
输出:
-
12233445566677 33
样例输入:
-
YES
样例输出:
注意事项:
开始提交了3次,都是wa,发现有一种测试用例我无法通过,也是上个代码错误的地方,测试用例如下:
样例输入:1122335566778899(不连续)12345
样例输出:yes
AC代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char a[101]; char b[101]; char ch, key; int i, lena, lenb, flag; int count[11]; while(scanf("%s",a) != EOF) { //接收回车符 ch = getchar(); //接收出牌 scanf("%s",b); ch = getchar(); //长度 lena = strlen(a); lenb = strlen(b); //初始化 memset(count,0,sizeof(count)); //遍历手牌 for(i = 0; i < lena; i ++) { count[a[i] - '0'] ++; } //检测对方出牌 switch(lenb) { case 1: case 2: case 3: case 4: flag = 0; for(key = b[0] - '0' + 1; key <= 9; key ++) { if(count[key] >= lenb) { flag = 1; break; } } break; case 5: flag = 0; for(key = b[0] - '0' + 1; key < 9; key ++) { if(count[key] > 0 && count[key + 1] > 0 && count[key + 2] > 0 && count[key + 3] > 0 && count[key + 4] > 0) { flag = 1; break; } } break; } //打印输出 if(flag) { printf("YES\n"); }else { printf("NO\n"); } } return 0; }