资源简介
时间复杂弃为 O(n) 可谓原地工作的 C++ 麻将胡牌 算法
代码片段和文件信息
//////////////////////////////////////////////////////////////////////////
// 主要功能 : 麻将听胡牌判断
// 修改时间 : 2014.08.25
// 修 改 人 : 杨 科 迪
// 参考文献 : 麻将胡牌算法的一种设计及其分析
//////////////////////////////////////////////////////////////////////////
#include “stdafx.h“
#include
#include
//函数声明
bool CheckHu( );
bool CheckTing( );
bool AnalyzeNormal( int [] );
bool AnalyzeJiang( int [] );
int nCards[3][10]={
{103311111} //万
{33} //筒
{0} //索
};
int main(int argc char* argv[])
{
//定义手中的牌
int nCardNum = nCards[0][0] + nCards[1][0] + nCards[2][0];
if ( (nCardNum % 3 == 2) && CheckHu( ) )
{
printf(“Hu!\n“);
}
else
{
printf(“Not Hu!\n“);
}
if ( (nCardNum % 3 == 1) && CheckTing( ) )
{
printf(“Ting!\n“);
}
else
{
printf(“Not Ting!\n“);
}
return 0;
}
//判断是否胡牌的函数
bool CheckHu( )
{
int nJiangPos; //“将”的位置
int nMod; //余数
bool bJiangExisted=false;
//是否满足33332模型
for(int i=0; i < 3; i++ )
{
nMod = nCards[i][0] % 3;
if ( nMod == 1 )
{
return false;
}
if ( nMod == 2 ) {
if ( bJiangExisted )
{ //存在两个将牌的可能 不能构成胡牌
return false;
}
nJiangPos = i;
bJiangExisted = true;
}
}
//非将牌类型判断
for(int i = 0; i < 3; i++ )
{
if ( i != nJiangPos) {
if (!AnalyzeNormal( nCards[i] ) )
{
return false;
}
}
}
//该类牌中要包含将 因为要对将进行轮询 效率较低放在最后
return AnalyzeJiang( nCards[nJiangPos] );
}
bool CheckTing( )
{
int bTing = false;
for ( int i = 0; i < 3; i++ )
{
nCards[i][0]++;
for( int j = 1; j < 10; j++ )
{
nCards[i][j]++;
if ( CheckHu( ) )
{
return true;
}
nCards[i][j]--
;
}
nCards[i][0]--;
}
return bTing;
}
/*
*普通牌型分析
*参数1: 类型牌数组
*参数2: 是否为字牌
*/
bool AnalyzeNormal(int aKindPai[] )
{
if (aKindPai[0]==0)
{
return true;
}
//寻找第一张牌
int j = -1;
for(j=1;j<10;j++)
{
if (aKindPai[j]!=0)
{
break;
}
}
bool result;
if (aKindPai[j]>=3)//作为刻牌
{
//除去这3张刻牌
aKindPai[j]-=3;
aKindPai[0]-=3;
result=AnalyzeNormal(aKindPai);
//还原这3张刻牌
aKindPai[j]+=3;
aKindPai[0]+=3;
return result;
}
//作为顺牌
if ( (j<8) && (aKindPai[j+1]>0) &&(aKindPai[j+2]>0))
{
//除去这3张顺牌
aKindPai[j]--;
aKindPai[j+1]--;
aKindPai[j+2]--;
aKindPai[0]-=3;
result=AnalyzeNormal( aKindPai );
//还原这3张顺牌
aKindPai[j]++;
aKindPai[j+1]++;
aKindPai[j+2]++;
aKindPai[0]+=3;
return result;
}
return false;
}
bool AnalyzeJiang( int aKindPai[] )
{
bool success=false; //指示除掉“将”后能否通过
for(int j = 1; j < 10; j++ ) //对列进行操作用j表示
{
//找到将牌所在位序
if ( aKindPai[j]>=2)
{
//除去这2张将牌
aKindPai[j]-=2;
aKindPai[0]-=2;
if( AnalyzeNormal( aKindPai ) )
{
success=true;
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2013-08-29 15:47 麻将胡牌判断\
文件 3574 2013-08-27 14:20 麻将胡牌判断\麻将胡牌判断.cpp
文件 196780 2013-08-27 10:54 麻将胡牌判断\麻将胡牌算法的一种设计及其分析.pdf
- 上一篇:编译原理-语义分析
- 下一篇:俄罗斯方块(黑白版)
相关资源
- 永磁同步电机的FOC控制算法
- Proteus仿真:PID算法输出.rar
- 一个模糊PID温度控制算法源代码
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
- c++ 画图(14Qt-XPS)
- c++多边形交并差运算
- VC++基于OpenGL模拟的一个3维空间模型
- c++ 虚拟摄像头
- hook,捕获所有案件,查找所有窗口,
- C语言课设计算器
- 经典滤波算法
- c++ 简易贪吃蛇源码
- 高精度加法(c++代码)
- KMP算法C语言程序
- C++调用百度地图案例
- 北京化工大学计算方法(C/C++)讲义
- 基于VC++的SolidWorks二次开发SolidWorks
- c++ 模拟鼠标按键
- OFD编辑器
- SVM算法实现(源码+文档)
- 算法A律U律实现
- 人工蜂群算法.docx
- Beginning C++17 From Novice to Professional
- C++ STL实现
- opencv手部轮廓识别以及轨迹识别
- 百度C++编码规范
评论
共有 条评论