九度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
",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
",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
",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 }
原文地址:https://www.cnblogs.com/jasonJie/p/5808046.html