判斷是否和牌

2021-07-03 21:07:53 字數 1849 閱讀 5595

演算法思路

概要描述:

如題:對於一副牌判斷是否和牌,在此演算法中認為 "要有一對做將,其他四個三張一樣的或順子" ,滿足此條件的認為是和牌

,否則沒有和.演算法思想就是找出任意一種和牌的可能,若一種都沒有判斷 false.

詳細描述:

1 編碼 

牌的編碼

1 - 36      萬

37 - 72     筒

73 - 108    條

109 - 124   風

115 - 136   箭

2 排序

對於給定一副牌先進行排序方便以後計算

3 搜尋

將所有三張一樣的或順子的可能找到,放入 vector 中

4 搜尋

在所有可能中,若找到滿足和牌的4組,認為和牌.當有很多滿足條件時,按編碼順序優先,

若搜尋完後沒有乙個滿足,認為沒有和牌.在此的搜尋用dp優化.

/*

判斷14張麻將是否和牌

萬 : 1到9萬, 各4張,共36張

筒 : 1到9筒, 各4張,共36張

條 : 1到9條, 各4張,共36張

風牌:東,南,西,北,各4張,共16張牌

箭牌:中,發,白,各4張,共12張牌

和牌要求:

打時是十三張,胡時是十四張,要有一對做將,其他四個三張一樣的或順子

*//*

演算法描述:

先找出將 搜尋可能的序列 用dp優化搜尋

*//*

牌的編碼

1 - 36 萬

37 - 72 筒

73 - 108 條

109 - 124 風

115 - 136 箭

*/#include #include #include #include // 順序表

#include // 演算法

#include // 迭代器

#define max 14

struct data;

using namespace std;

// 開出乙個足夠大的dp陣列

// 最大序列是76

int dp[100][100];

// 初始化dp陣列

void initdp()

// 遞迴函式

bool dpfun(vector*mod,int now,int next,int count,int *repeat)

}int t = mod->size();

// 遞迴結束的條件

if(count == 2) return true;

// 搜尋

for(i=next+1;i*mod,int *repeat)*/

// 最少四個都不滿足無需以後比較

if(mod.size() < 4)

return false;

// 找出將

for(i=0;irepeat[card[i]] = -1;

repeat[card[i+1]] = -1;

// 初始化

initdp();

if(dpfun(&mod,repeat))

return true;}}

return false;

}int main();

int i;

/*srand( (unsigned)time( null ) );

for(i=0;iif(judge(card))

cout << "和";

return 0;

}

如有錯誤 請不吝賜教

麻將牌和牌問題

在知乎上看到乙個問題,如何用程式判斷麻將牌是否和牌。和牌的規則為 14張麻將牌當中,必須要有乙個對子,即兩張相同的牌,除去對子後,剩下的牌可以組合成 a,a,a 或者 a,a 1,a 2 兩種模式的組合,其中a為某種花色的某張牌。我的解法是 首先定義一下麻將牌在程式中的表示方式 把萬,餅,條分別用連...

判斷是否平板

1.一般解析度大於wvga螢幕精度小於等於mdpi的 可以認為是平板了 displaymetrics dm new displaymetrics getwindowmanager getdefaultdisplay getmetrics dm double diagonalpixels math.s...

判斷 是否匹配

寫乙個函式,檢查乙個表示式中的括號是否合法,括號包括 思路 用棧,每次找到關鍵字是括號的時候,檢查棧頂元素是否為匹配的括號。如果是匹配的,棧頂元素出棧,否則新的括號入棧。檢查所有的括號元素後,如果此時棧為空,則表示式正確,否則表示式錯誤。include include includeusing na...