资源简介
时间复杂弃为 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
- 上一篇:编译原理-语义分析
- 下一篇:俄罗斯方块(黑白版)
相关资源
- C++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- CCS FFT c语言算法
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- 小波变换算法 c语言版
- 3des加密算法C语言实现
- C++纯文字DOS超小RPG游戏
- DES加密算法C语言实现
- VC++MFC小游戏实例教程(实例)+MFC类库
- 线性回归算法c语言实现
- 基于C语言的模拟退火算法
- C语言实现的DES对称加密算法
- 用VC6.0实现多边形扫描线填充算法
- c语言编写的货郎担算法
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
评论
共有 条评论