您的位置:首页 > 其它

从扑克牌中随机抽取5张牌,判断是不是一个顺子。

2016-04-07 14:12 519 查看
一、算法描述:

从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续的2-10位数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字

二、算法解决:

在这个算法里,由于大小王可以是任意数字,所以即使像下面的5张牌,仍然可以是连续的。



图1



图2
所以说1的个数和数据之间的间隔和的关系决定了是不是一个连续的5个数。

以图2为例进行推导。

首先,先计算数组中含有0的个数。

IsZero = 2;

然后,将数组进行排序



图3
从数组numbers的4开始看数据间的间隔(numbers[i+1]-numbers[i]-1)
即从numbers[IsZero]开始进行统计
LenGap = 2
如果LenGap大于IsZero,则不能形成连续数组,否则可以形成连续数组。
三、算法实现:

算法通过Linux下运行的,主要包括continusCards.c,continusCards.h,main.c,Makefile四个文件

make
即可得到结果

/*************************************************************************
> File Name: continusCards.c
> Author: cyf
> Mail: XXX@qq.com
> Created Time: 2016年04月06日 星期三 14时56分30秒
************************************************************************/

#include "continusCards.h"

/*
* 从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续的
* 2-10位数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字
* */
int InsertSort(int *numbers, int length)
{
int ret = 0;
if (numbers == NULL || length < 1)
{
ret = -1;
printf("func InsertSort() err:param\n");
}

int i = 0, j = 0;
int temp = 0;

for (i = 0; i < length; i++)
{
for (j = i + 1; j < length; j++)
{
if (numbers[i] > numbers[j])
{
temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = temp;
}
}
}
return ret;
}
int IsContinous(int *numbers, int length)
{
/*
* 先将数组进行排序,然后记录数组中0的个数
* 记录数组中的差距和,比较0的个数和数组差距
* */
int ret = 0;
if (numbers == NULL || length <1)
{
ret = -1;
return -1;
}

int IsZero = 0;
int GapLen = 0;
int i = 0;

for (i = 0; i < length; i ++)
{
if (numbers[i] == 0)
{
IsZero ++;
}

}

InsertSort(numbers, length);
int pBegin = IsZero;
int pEnd = IsZero + 1;

while (pEnd < length)
{
if (numbers[pBegin] == numbers[pEnd])
ret = 1;

GapLen = numbers[pEnd] - numbers[pBegin] - 1;
pBegin = pEnd;
pEnd ++;
}

if (GapLen > IsZero)
ret = 1;

return ret;
}


/*************************************************************************
> File Name: continusCards.h
> Author: cyf
> Mail: XXX@qq.com
> Created Time: 2016年04月06日 星期三 14时48分52秒
************************************************************************/

#ifndef CONTINUSCARDS_H
#define CONTINUSCARDS_H

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

int IsContinous(int *numbers, int length);
#endif


/*************************************************************************
> File Name: main.c
> Author: cyf
> Mail: XXX@qq.com
> Created Time: 2016年04月06日 星期三 15时19分36秒
************************************************************************/

#include "continusCards.h"
int Test(char *testName, int *numbers, int length, int expected)
{
int ret = 0;
if (testName == NULL || numbers == NULL ||length <1)
{
ret = -1;
printf("func Test() err:param\n");
}

int result = 0;
result = IsContinous(numbers, length);

if (result == expected)
printf("Test:%s is success!\n", testName);
else
printf("Test:%s is success!\n", testName);

return ret;
}
int main()
{
int rv = 0;
int testNumbers[5] = {9, 0, 5, 8, 7};
int testNumbers1[5] = {0, 1, 5, 1, 3};
int testNumbers2[5] = {0, 0, 5, 1, 3};
rv = Test("test1", testNumbers, 5, 0);
if (rv == -1)
{
printf("func Test() err\n");
}
rv = Test("test2", testNumbers1, 5, 1);
if (rv == -1)
{
printf("func Test() err\n");
}

rv = Test("test3", testNumbers2, 5, 0);
if (rv == -1)
{
printf("func Test() err\n");
}

return 0;
}


CC = gcc
CFLAGS = -g

%.o:%.c
$(CC) -o $@ -c $(CFLAGS) $<

main:main.o continusCards.o
$(CC) main.o continusCards.o -o main $(CFLAGS)

clean:
rm -rf *.o main
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: