如何求扑克牌的顺子

题目描述:

LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。

现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何。为了方便起见,你可以认为大小王是0。

输入:

输入有多组数据。

每组数据包含两行,第一行输入一个正数n(0<=n<=14),表示从扑克牌中抽出的扑克牌数。接下来的一行输入n个数,表示从这幅扑克牌中抽出的牌。如果n=0,则结束输入。

输出:

对应每组数据,如果抽出的牌是顺子,则输出“So Lucky!”。否则,输出“Oh My God!”。

样例输入:

5

3 5 1 0 4

5

3 5 4 7 6

5

3 5 7 4 8

0

样例输出:

So Lucky!

So Lucky!

Oh My God!

九度上把这道题目改成了一副扑克牌有4张大小王,这里姑且不管它最多几个0,就题目来说,不严谨,很含糊,比如这里没有对顺子给出比较严谨的定义,5个以下的连续数字算是顺子吗?现实中要至少5个才算顺子的,而且如果假设3个牌也算顺子,那如果输入的是3个0呢,这有点太牵强了!看论坛里面好多人吐槽。总之,不管那么多,这道题目无论它怎么坑爹,用剑指offer上的思路写的代码AC是没问题的,因为这里不管你0有多少个(只要不大于数组的长度就可)都OK。

本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

我之前想避开排序,或者开辟哈希数组,就遍历一遍求出最大值,最小值,0出现的次数,而后根据三者间的关系来判断是否构成顺子,但这要在数组中没有重复元素的前提下,而要判断数组中没有重复元素,要么要排序,要么就要借助哈希数组统计元素出现的次数,最终还是省不掉。无奈最后还是用书上的思路,为求代码的简洁性,一样用C语言自带的快速排序函数,当然用计数排序(其实跟开辟哈希数组就是一个思路)更快点,但对n最大为14的情况,二者效率差不了太多。

AC代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>  

int mycompare(const void *data1,const void *data2)
{
    return *(int *)data1 - *(int *)data2;
}  

bool IsContinuous(int *arr,int len)
{
    if(arr==NULL || len<1)
        return false;  

    qsort(arr,len,sizeof(int),mycompare);  

    int NumOf0 = 0;     //0的个数
    int NumOfGap = 0;  //空缺的个数
    int i;
    for(i=0;i<len-1;i++)
    {
        if(arr[i] == 0)
            NumOf0++;
        else
        {
            if(arr[i] == arr[i+1])
                return false;
            else
                NumOfGap += arr[i+1]-arr[i]-1;
        }
    }
    return (NumOfGap>NumOf0)?false:true;
}  

int main()
{
    int n;
    int arr[15];
    memset(arr,0,sizeof(arr));
    while(scanf("%d",&n)!=EOF && n!=0)
    {
        int i;
        for(i=0;i<n;i++)
            scanf("%d",arr+i);  

        bool can = IsContinuous(arr,n);
        if(can)
            printf("So Lucky!\n");
        else
            printf("Oh My God!\n");
    }
    return 0;
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据
, 输入
, 大小
扑克牌
扑克牌顺子、判断扑克牌是否为顺子、扑克牌 顺子 英文、扑克牌算命 顺子、如何飞扑克牌,以便于您获取更多的相关知识。

时间: 2024-08-14 05:57:56

如何求扑克牌的顺子的相关文章

扑克牌的顺子的编程算法

题目: 从扑克牌中随机抽取5张牌, 判断是不是一个顺子, 即这5张牌是不是连续的. 2~10为数字本身, A为1, J为11, Q为12, K为13, 而大小王可以看成任意数字. 排序, 判断字符串之间的间隔数, 如果小于等于大小王的数量, 则是连续, 否则不是. 代码: /* * main.cpp * * Created on: 2014.7.12 * Author: spike */ #include <stdio.h> #include <stdlib.h> #include

使用C语言求解扑克牌的顺子及n个骰子的点数问题_C 语言

扑克牌的顺子    问题描述:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的.2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字.          思路:可以将这5张牌排个序,然后统计出0的个数以及非0数字之间的间隔数,如果出现重复的非0数字,那么不是顺子.如果间隔数小于等于0的个数,那么是顺子.暂时未想到更好的办法.          参考代码: //函数功能 : 从扑克牌中随机抽5张牌,判断是不是一个顺子 //函数参数 : pCards为

数据结构与算法面试题80道

1.把二元查找树转变成排序的双向链表  题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. 要求不能创建任何新的结点,只调整指针的指向.    10  / \  6 14  / \ / \ 4 8 12 16  转换成双向链表 4=6=8=10=12=14=16.    首先我们定义的二元查找树 节点的数据结构如下:  struct BSTreeNode {  int m_nValue; // value of node  BSTreeNode *m_pLeft; // lef

算法面试题

1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. 要求不能创建任何新的结点,只调整指针的指向. 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16. 首先我们定义的二元查找树 节点的数据结构如下: struct BSTreeNode { int m_nValue; // value of node BSTreeNode *m_pLeft; // left child of nod

求两人玩的扑克牌游戏

问题描述 急急急!!!!求大神帮忙,用c#窗体运用程序写一个两人玩的纸牌游戏,就是我们常说的挑三张.简单的游戏规则就是1.给每人发三张牌,牌面向上2.最大的为三匹(同点)比如说2,2,2,其次是同花如核桃QKA,接下来是顺子花色不同的QKA.发完牌比较弹出窗口显示赢家(玩家用A,B表示)点数相同为平局 解决方案 解决方案二:http://download.csdn.net/detail/sharingall/4429115http://download.csdn.net/detail/hitaf

剑指offer系列之四十三:扑克牌顺子

题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)-他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!"红心A,黑桃3,小王,大王,方片5","Oh My God!"不是顺子-..LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13.上面的5张牌就可以变成"1,2,3,4,5"(大小王

求j2me 棋牌游戏-斗地主 的算法?

问题描述 求j2me棋牌游戏-斗地主的算法? 解决方案 解决方案二:算法解决方案三:代码例子解决方案四:首先是,判断牌的大小然后,电脑AI,出牌,跟牌,再,出牌的AI,放下家?正常出牌,按照手上牌优先出的顺序出跟牌的AI,有的比他大的,判断是否要打,还是不打解决方案五:要源代码例子解决方案六:竹木一瓜;看过你的回复,首先谢谢.如果.你能贴出点,实现方法的代码更好.解决方案七:这玩意儿要收费的解决方案八:/***规则判断**@authorzg.shi*/publicinterfaceRule{pu

24点扑克牌游戏的算法实现

二十四点扑克牌游戏大概所有人都玩过,规则非常简单,随机抽出四张牌,由1到9中的数字组成(当然也可以扩展到任意整数),然后利用加减乘除以及括号组成一个算术表达式,计算这个表达式的结果是否能够为24(或任意整数).看到这个题的第一反应就是利用穷举法来做,也就是建立一个搜索树,把所有的可能枚举出来,然后检查每种可能是否结果可以为24.基于这种思想,我们可以把问题分成三个步骤: 首先可以列出4个整数的所有排列,也就是求集合中元素的所有排列的问题,眼熟了吧?相信很多人都看过这个问题,一般的方式是用函数的递

求按从小到大的顺序的第5个丑数

题目: 我们把只包含因子2, 3 和 5的数称作丑数. 求按从小到大的顺序的第5个丑数. 可以设置一个数组包含所需要的丑数, 依次比较乘以2, 乘以3, 乘以5的最小的数, 最后返回结果. 如第5个丑数是5, 如1, 2, 3, 4(2*2), 5均是丑数. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> #include &