zoukankan      html  css  js  c++  java
  • 九度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 }
  • 相关阅读:
    bzoj3653: 谈笑风生
    bzoj1858: [Scoi2010]序列操作
    bzoj1857: [Scoi2010]传送带
    bzoj1856: [Scoi2010]字符串
    bzoj1855: [Scoi2010]股票交易
    bzoj1854: [Scoi2010]游戏
    bzoj1853: [Scoi2010]幸运数字
    斜堆,非旋转treap,替罪羊树
    NOI2003 文本编辑器
    A_star poj2449 k短路
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5808046.html
Copyright © 2011-2022 走看看