• 大小: 132KB
    文件类型: .zip
    金币: 2
    下载: 1 次
    发布日期: 2021-08-03
  • 语言: C/C++
  • 标签: C++  麻将胡牌  算法  

资源简介

时间复杂弃为 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

评论

共有 条评论