資源簡介
時間復雜棄為 O(n) 可謂原地工作的 C++ 麻將胡牌 算法

代碼片段和文件信息
//////////////////////////////////////////////////////////////////////////
//?主要功能?:?麻將聽胡牌判斷
//?修改時間?:?2014.08.25
//?修?改?人?:?楊?科?迪
//?參考文獻?:?麻將胡牌算法的一種設(shè)計及其分析
//////////////////////////////////////////////////////////////////////////
#include?“stdafx.h“
#include??
#include??
//函數(shù)聲明?
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;?
}?
//判斷是否胡牌的函數(shù)?
bool?CheckHu(??)?
{?
int?nJiangPos; //“將”的位置?
int?nMod; //余數(shù)?
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?)??
{?//存在兩個將牌的可能?不能構(gòu)成胡牌
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;
}
?
/*
*普通牌型分析
*參數(shù)1:?類型牌數(shù)組
*參數(shù)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??麻將胡牌判斷\麻將胡牌算法的一種設(shè)計及其分析.pdf
- 上一篇:編譯原理-語義分析
- 下一篇:俄羅斯方塊(黑白版)
評論
共有 條評論