麻将算法c语言,[转载]麻将胡牌的检测算法
自己写了一个四川麻将胡牌的算法,加入有两组牌让你判定是否胡牌,其中char *as1 =
"1W1W2T2D3W3W5W5W7W7W8W8W9W9W"; char
*as2 = "1W1W1W2W3W4W4W5W6W7W8W9W9W9W";
主要思想是:
1)给牌分组,并排序;检查是否打缺了,只有缺了一门才能胡牌哦;
在排序的时候一定是有14张牌(否则可能就是小相公哦,呵呵……)
for (i=0; i<28; i++)//
{
if(*(Cards + i) == 'D')
{
pb[b++] =
*(Cards + i -1);
}
if(*(Cards + i) ==
'T')
{
pt[t++] =
*(Cards + i -1);
}
if(*(Cards + i) ==
'W')
{
pw[w++] =
*(Cards + i -1); }
}
if(b != 0 && t
!=0 && w != 0)
{
printf("n惨了,还没打缺呢……n");
return false;
}
sort(pb,b);
sort(pt,t);
sort(pw,w);
2)找找看对子在哪里,再开始三三组合
bool Group( char *pp,int n)
{
char q[14];
char r;
int i,j,k=0;
r = '0';
for (i = 0;i < n;i++)
{
q[i] = *(pp + i);
}
if (n == 0)
{
return true;
}
else if(n%3 ==
2) //必定存在一对对子
{
for (i =
k;i
{
if (*(q + i)
== *(q + i + 1) && *(q + i) !=
r) //找对子,并剔除对子
{ r
= *(q + i);
for
(j = i; j < n - 2; j++)
{
*(q
+ j) = *( q + j +
2); //所有元素左移两位
}
*(q
+ j) = ' ';
i--;
k
= i;
if(Group3S(q,n-2)) //某一花色组合正确
{
return
true;
}
for
(j = 0;j < n;j++)
{
q[j]
= *(pp +
j); //恢复原来的数组,并进行下一轮对子的选择
}
} //找出对子,并剔除,在剩余的12张牌中进行组合
}
}
else //没有对子,只能是三个三个一组(三个相同或者顺子)
{
if(Group3S(q,n))
{
return
true; //某一花色组合正确
}
}
return
false; //输了 }
3)如何判断某一花色组合正确。
递归调用组合函数Group3S,每次先进行顺子组合,若不能成功,再进行三个相同的组合
找到一组三个相同的组合,在递归调用本函数,不断的进行顺子-三个相同 顺子-三个相同
递归的次数不会超过四次,因为只有12张牌,每一次找到三个相同的牌,都会减少三张牌实现代码如下:
bool Group3S(char *p, int n)
{
char pp[14],p2[14];
int i,j;
for (i = 0;i < n;i++)
{
pp[i] = *(p + i);
p2[i] = *(p + i);
}
bool flag = false;
if (n == 0)
{
return true;
}
if(!Group3Shunzi(p,n))
return true;
if
(Group3Same(p2,n)) //顺子出错,就看看有没有三个相同的,有就把三个相同的挑出来,在进行顺子算法
{
n -= 3;
flag = Group3S(p2,n);
}
return flag;
}
4)找出顺子,每找到一组顺子就把顺子剔除,最后,返回数组中剩余的元素的个数,如果返回值为0,
能够组合成若干个顺子,可以胡牌,否则,不能组合成顺子,不能胡牌该算法的核心算法代码如下:
int Group3Shunzi(char *p,int n)
{
char *q,*w;
int i,j,k,m,l,sp = 0;
m=0;
q = p;
w = p;
if ( n == 0)
{
return 0;
} for(i = 0; i <
n - 2; i++)
{
for (j = i+1;j <
n - 1; j++ )
{
if (*(q + j)
- *(q + i) == 1)
{
for
(k = j + 1; k < n ; k++ )
{
if
(*(q + k) - *(q + j) == 1)
{
if
(i == n - 3
) //把这三个元素移除,把后面的元素往前移动三格
{
*(q+i)
= ' ';
n
-= 3;
i--;
break; } else
{
*(q
+ i) = '0';
*(q
+ j) = '0';
*(q
+ k) = '0';
for
(m = 0,l = 0;l < n ; l++)
{
if
(*(q + l) != '0')
{
*(w
+ (m++)) = *(q + l);
}
}
n
= m;
q
= w;
i--;
break;
} }
}
}
continue;
}
}
return n;
}
5)找出相同的三个连续的牌,如果找到就剔除这三个牌,并返回真,传递进来的数组元素比原来少了3个如果没有,返回假
bool Group3Same(char *p,int n)
{
char * q;
int sp=0;
int i,j;
q = p;
if (n == 0)
{
return true;
}
for(i = 0; i < n - 2; i++)
{
if (*(q + i + 1) == *(q +
i)&& *(q + i + 2) == *(q + i +
1))
{ if (i == n -
3
) //把这三个元素移除,把后面的元素往前移动三格
{
*(q+i)
= ' ';
p
= q;
return
true;
} else
{
for
(j = i;j < n - 3; j++)
{
*(q
+ j) = *(q + j + 3)
; }
*(q+j)
= ' ';
p
= q;
return
true;
}
}
}
return false;
}
这是我自己想的一个办法,如果你觉得哪里不对或者是有更多好办法,可以教教我,呵呵……
麻将算法c语言,[转载]麻将胡牌的检测算法相关推荐
- 万元大奖,FlyAI算法新赛事,心理卡牌目标检测
本文转自竞赛社区FlyAI最新上线算法赛. "心理卡牌目标检测算法赛"由测测星座与趣鸭心理联合发起的线上竞赛项目.2020年新冠肺炎疫情打破了我们平静的生活,影响了我们的身体健康和 ...
- c语言sobel边缘检测,Sobel图像边沿检测算法的优化设计与实现
0 引言 图像边沿是图像的基本特征,是图像分割.特征提取等图像分析的重要依据,目前已广泛应用于目标识别.机器视觉和运动目标跟踪等领域.现今已有多种边沿检测算法以及一些改进方式,但各种算法都有各自的优缺 ...
- C语言麻将递归,C++数据结构与算法——麻将胡牌算法(二:完全胡牌算法)
虽然单花色胡牌算法面试时写出来了,但是完整的胡牌算法却没有写,既然遇到了,秉着不抛弃不放弃的精神,当然不能原谅懒惰的自己了.下面这篇为一个完整的胡牌算法. 胡牌规则除了以下几点,其余与单花色胡牌规则一 ...
- 哈夫曼编码算法 c语言,《哈夫曼编码的算法》
以前的作业,拿出来看看,都不会了.郁闷 记得当时为了完成这作业,求了一圈朋友,最后还是在图书馆网络中找的!呵呵!在这里晒晒了 设计报告内容: 一. 课程设计名称 <哈夫曼编码的算法> 二. ...
- gn算法java_R语言构建蛋白质网络并实现GN算法
R语言构建蛋白质网络并实现GN算法 1.蛋白质网络的构建 我们使用与人类HIV相关的蛋白质互作数据hunam-HIV PPI.csv来构建这个蛋白质互作网络. 在R中,我们可以从存储在R环境外部的文件 ...
- 蝙蝠算法c语言,一种新颖的群智能算法:飞蛾扑火优化算法
李志明+莫愿斌+张森 摘要 飞蛾扑火优化(MFO)算法是一种新颖的群智能优化算法,该算法的主要灵感来源于飞蛾在自然界中被称为横向定位的飞行方式.作为一种新提出的仿生群智能优化算法,分析了飞蛾扑火优化算 ...
- 首次适应算法_CVPR 2020丨?商汤TSD目标检测算法获得Open Images冠军
编者按:此前,在文章<商汤科技57篇论文入选ICCV 2019,13项竞赛夺冠>里,商汤君报道了商汤科技荣获Open Images Object Detection Challenge 2 ...
- 人脸检测算法_腾讯已开源高精度人脸检测算法DSFD
腾讯提出一种高精度双分支人脸检测器DSFD并开源.该算法曾在全球两大权威人脸检测数据集WIDERFACE和FDDB上均取得了第一. 任务介绍 人脸检测算法是在图像上检测出人脸的位置(通常以矩形框形式输 ...
- sift算法_论文和专利笔记:翻拍检测算法
数码翻拍图像取证算法(论文) 方法一:噪声分析 通过小波变换(具体的方法包括可分离的散 小 波 变 换 ( Separable 2-D DWT),二维双树离散实数小波变换 ( Real 2-D dua ...
- 辛甫生算法c语言,[转载]实变函数,计算方法程序,康托图
计算方法程序: 1. 秦九韶算法 2.二分法 3.拉格朗日插值 4.埃特金算法 5.复化梯形法 6.复化辛甫生算法 7.二阶龙格库塔方法 8.四阶龙格库塔方法 9.改进的欧拉方法 10.迭代法 11. ...
最新文章
- 强网杯2019 Copperstudy
- docker容器的标准使用过程_phpStorm中使用xdebug工具调试docker容器中的程序
- (C语言版)栈和队列(二)——实现顺序存储栈和顺序存储队列的相关操作
- vim插件之cscope的安装与配置
- 双向链表中基本函数的实现
- jsfl读取xml,图片,并生成swf
- 移动开发构架漫谈——反劫持实战篇
- 读书笔记 摘自:《学会提问》
- 【​观察】加速“云矩阵”生态落地,京东云能否成为新变量?
- RabbitMQ之路(二):添加用户和虚拟主机
- 360浏览器登录新浪微博图标显示为字母及占用CPU过高问题的解决
- HFSS15 win10安装
- 数学/数论专题-学习笔记:狄利克雷卷积
- 《LeetCode之每日一题》:148.回旋镖的数量
- html 水印插件,Watermark.js 在浏览器端添加水印插件 - 文章教程
- 在windows下编译erlang内建函数(nif)的dll文件
- 分享tushare量化接口获取港股列表信息的代码
- eSIM(Embedded-SIM)-嵌入式SIM卡
- 如何保存微信视频到本地,微信朋友圈怎么发本地的视频。
- 护卫神6588端口提权
热门文章
- 【观察】阿里云栖大会究竟好在哪里?
- 51单片机用1602液晶屏实现可调时钟
- server sql 将出生日期转为年龄_sql server 根据身份证号计算出生日期和年龄的存储过程...
- android 画圆形 bitmap,在android中画圆形图片的几种办法
- 关于在窗体之间传值的问题 C# winform
- C语言加油站程序,计算机学院“0101”计划名师导航篇“C语言加油站”第一讲如期开讲...
- 笔记本怎么自己装系统?u盘装系统windows7教程图解
- 3-2Java数组----一维数组的使用----练习1(电话)
- 分享 | masked自编码器(MAE):一种可扩展的用于计算机视觉任务的自监督学习器
- 3.并列句的起源与本质