九度oj 题目1363:欢乐斗地主
题目描述:
如果大家玩过欢乐斗地主这个游戏,就一定知道有一个具有“提示”功能的按钮。如果你不知道你现在手里的牌有没有比上家大的牌,并且你也懒得去一张一张地看你手中的牌。这时候你就可以点“提示”按钮,系统会告诉你是否有这样的牌。
如果你是一个喜欢挑战的人,你就一定会想,能不能写一个程序,让它实现欢乐斗地主中的“提示”按钮的功能。
现在,我们把“提示”按钮所具有的功能简化,它只需要找出在上家出的牌是“三带一对”的情况下你手中的牌是否比上家的牌大。
- 输入:
-
每组测试数据可能有多组输入,对于每一组输入,
输入的第一行包括一个整数N(1<=N<=18),代表你手中现在还剩下的扑克牌的张数。
接下来的一行包括N个数字(1-13,分别代表扑克牌中的A-K),给你的这N个数字是无序的。
接下来的一行包括五个数字,前三个数字是相同的,后两个数字是相同的,代表上家出的“三带一对”。
- 输出:
-
如果你手中的牌有比上家的“三带一对”大的,输出这样的牌,输出的格式与输入中的第三行相同,即五个数字:前三个是一样的,后两个是一样的,代表你手中的“三带一对”。如果你手中没有比上家的“三带一对”大的牌,请输出“My God”。
- 样例输入:
-
8 1 6 4 8 4 7 6 4 3 3 3 9 9 8 1 6 4 8 4 7 6 4 8 8 8 2 2
- 样例输出:
-
4 4 4 6 6 My God
- 提示:
-
1.“三带一对”:三张同样数字的牌+两张同样数字的牌,此时这五张牌可以同时出。“三带一对”比大小的规则如下——只需要比较三张同样数字的牌的数字的大小,而不需要考虑两张同样数字的牌的数字的大小。比如:“三个5带两个3”,比“三个4带两个8”要大。
2.大家都知道,在扑克牌中A和2要比3-K都要大,请大家在程序中进行处理。
3.如果你手中的牌有多种出法能够比上家的“三带一对”大,你需要选择“三带一对”中三张相同的牌数字较小的那种出法。比如说,如果上家出的牌是3 3 3 4 4,而你现在手中有6 6 6 7 7 7这6张牌,你需要出的牌是6 6 6 7 7,而不是7 7 7 6 6,如果三带最小的有多个,则需要输出一对值最小的那个结果。
4.你可以放心,我们发的牌以及出的牌中不会出现大小王。
一开始的代码是这样
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 int card[22]; 6 int base[6]; 7 int n; 8 int num[] = {0,12,13,1,2,3,4,5,6,7,8,9,10,11}; 9 int card2[22]; 10 int card3[22]; 11 12 int cmp(const void *a , const void *b) { 13 int at = *(int *)a; 14 int bt = *(int *)b; 15 return num[at] - num[bt]; 16 } 17 int main(int argc, char const *argv[]) 18 { 19 while(scanf("%d",&n) != EOF) { 20 for(int i = 0; i < n; i++) { 21 scanf("%d",&card[i]); 22 } 23 for(int i = 0; i < 5; i++) { 24 scanf("%d",&base[i]); 25 } 26 qsort(card, n, sizeof(int), cmp); 27 int i = 1; 28 int p2 = 0, p3 = 0; 29 while(i < n) { 30 int cnt = 1; 31 while(card[i] == card[i-1]) { 32 cnt++; 33 i++; 34 } 35 if(cnt == 2) { 36 card2[p2++] = card[i-1]; 37 } 38 else if(cnt == 3) { 39 card3[p3++] = card[i-1]; 40 card2[p2++] = card[i-1]; 41 } 42 i++; 43 } 44 int t3 = -1; 45 for(int j = 0; j < p3; j++) { 46 if(num[card3[j]] > num[base[0]]) { 47 t3 = card3[j]; 48 break; 49 } 50 } 51 if(t3 == -1) { 52 puts("My God"); 53 continue; 54 } 55 int t2 = -1; 56 for(int j = 0; j < p2; j++) { 57 if(card2[j] != t3) { 58 t2 = card2[j]; 59 break; 60 } 61 } 62 if(t2 == -1) { 63 puts("My God"); 64 continue; 65 } 66 printf("%d %d %d %d %d\n",t3,t3,t3,t2,t2); 67 } 68 return 0; 69 }
居然一个例子都没通过。
这段代码的两个问题,38行,cnt==4时没处理
31行,没判断i < n
修改如下
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 int card[22]; 6 int base[6]; 7 int n; 8 int num[] = {0,12,13,1,2,3,4,5,6,7,8,9,10,11}; 9 int card2[22]; 10 int card3[22]; 11 12 int cmp(const void *a , const void *b) { 13 int at = *(int *)a; 14 int bt = *(int *)b; 15 return num[at] - num[bt]; 16 } 17 int main(int argc, char const *argv[]) 18 { 19 while(scanf("%d",&n) != EOF) { 20 for(int i = 0; i < n; i++) { 21 scanf("%d",&card[i]); 22 } 23 for(int i = 0; i < 5; i++) { 24 scanf("%d",&base[i]); 25 } 26 qsort(card, n, sizeof(int), cmp); 27 28 /*for(int i = 0; i < n; i++) { 29 printf("%d ",card[i]); 30 } 31 puts("");*/ 32 int i = 1; 33 int p2 = 0, p3 = 0; 34 while(i < n) { 35 int cnt = 1; 36 while(i < n && card[i] == card[i-1]) { 37 cnt++; 38 i++; 39 } 40 if(cnt >= 3) { 41 card3[p3++] = card[i-1]; 42 card2[p2++] = card[i-1]; 43 } 44 else if(cnt >= 2) { 45 card2[p2++] = card[i-1]; 46 } 47 i++; 48 } 49 int t3 = -1; 50 for(int j = 0; j < p3; j++) { 51 if(num[card3[j]] > num[base[0]]) { 52 t3 = card3[j]; 53 break; 54 } 55 } 56 if(t3 == -1) { 57 puts("My God"); 58 continue; 59 } 60 int t2 = -1; 61 for(int j = 0; j < p2; j++) { 62 if(card2[j] != t3) { 63 t2 = card2[j]; 64 break; 65 } 66 } 67 if(t2 == -1) { 68 puts("My God"); 69 continue; 70 } 71 printf("%d %d %d %d %d\n",t3,t3,t3,t2,t2); 72 } 73 return 0; 74 }
当然,也可以换一种思路
1 #include <cstdio> 2 #include <cstring> 3 4 int card[22]; 5 int num[] = {0,0,0,3,4,5,6,7,8,9,10,11,12,13,1,2}; 6 int fnum[] = {0,14,15,3,4,5,6,7,8,9,10,11,12,13}; 7 int n; 8 int m, p; 9 int main(int argc, char const *argv[]) 10 { 11 while(scanf("%d",&n) != EOF) { 12 memset(card,0,sizeof(card)); 13 while(n--) { 14 int tmp; 15 scanf("%d",&tmp); 16 card[tmp]++; 17 } 18 scanf("%d %d %d %d %d",&m,&m,&m,&p,&p); 19 bool isFind = false; 20 for(int i = fnum[m]+1; i <= 15 && !isFind; i++) { 21 if(card[num[i]] >= 3) { 22 for(int j = 3; j <= 15 && !isFind; j++) { 23 if(card[num[j]] >= 2 && j != i) { 24 int t1 = num[i], t2 = num[j]; 25 printf("%d %d %d %d %d\n",t1,t1,t1,t2,t2); 26 isFind = true; 27 } 28 } 29 } 30 } 31 if(!isFind) { 32 puts("My God"); 33 } 34 } 35 return 0; 36 }