c++ 贵阳麻将 胡牌算法
时间: 2023-08-11 07:31:50 浏览: 238
在贵阳麻将游戏中,判断胡牌需要遵循以下规则:
1. 手牌中有七对牌,即七对同样的牌,可以胡牌。
2. 手牌中有四副牌,即三张相同的牌加一张相同序数的牌,可以胡牌。
3. 手牌中有将牌,即两张相同的牌,如果能组成四副牌,可以胡牌。
4. 手牌中有顺子,即三张不同序数但同花色的牌,如果能组成四副牌,可以胡牌。
5. 手牌中有刻子,即三张相同的牌,如果能组成四副牌,可以胡牌。
在实现胡牌算法时,可以先对手牌进行排序,然后遍历每张牌,递归判断是否能组成胡牌形式。为了避免重复计算,可以使用记忆化搜索进行优化。
下面是一个简单的胡牌算法实现:
```c++
bool canHu(vector<int>& cards) {
int size = cards.size();
if (size == 0) {
return true;
}
if (size % 3 != 2) {
return false;
}
sort(cards.begin(), cards.end());
if (is7Pairs(cards)) {
return true;
}
for (int i = 0; i < size; i++) {
if (i > 0 && cards[i] == cards[i-1]) {
continue;
}
if (isKeZi(cards, i) || isShunZi(cards, i) || isJiang(cards, i)) {
vector<int> tmp(cards.begin(), cards.end());
tmp.erase(tmp.begin()+i, tmp.begin()+i+3);
if (canHu(tmp)) {
return true;
}
}
}
return false;
}
bool is7Pairs(vector<int>& cards) {
int size = cards.size();
if (size != 14) {
return false;
}
for (int i = 0; i < size-1; i+=2) {
if (cards[i] != cards[i+1]) {
return false;
}
}
return true;
}
bool isKeZi(vector<int>& cards, int i) {
if (i + 2 >= cards.size()) {
return false;
}
return cards[i] == cards[i+1] && cards[i] == cards[i+2];
}
bool isShunZi(vector<int>& cards, int i) {
if (i + 2 >= cards.size()) {
return false;
}
return cards[i] + 1 == cards[i+1] && cards[i] + 2 == cards[i+2]
&& cards[i] / 10 == cards[i+1] / 10 && cards[i] / 10 == cards[i+2] / 10;
}
bool isJiang(vector<int>& cards, int i) {
if (i + 1 >= cards.size()) {
return false;
}
return cards[i] == cards[i+1];
}
```
在上述实现中,`canHu`函数用于递归判断是否能胡牌,`is7Pairs`函数用于判断是否有七对牌,`isKeZi`函数用于判断是否有刻子,`isShunZi`函数用于判断是否有顺子,`isJiang`函数用于判断是否有将牌。
阅读全文