演算法思路
概要描述:
如題:對於一副牌判斷是否和牌,在此演算法中認為 "要有一對做將,其他四個三張一樣的或順子" ,滿足此條件的認為是和牌
,否則沒有和.演算法思想就是找出任意一種和牌的可能,若一種都沒有判斷 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...