c++胡牌算法分为几种
时间: 2023-11-13 14:26:07 浏览: 38
C++胡牌算法主要有两种,一种是基于暴力枚举的算法,另一种是基于牌型判断的算法。
基于暴力枚举的算法通过将所有可能的牌型进行枚举,来判断当前手牌是否能够胡牌。这种算法的优点是简单易懂,容易实现,但是时间复杂度比较高,不适合处理大规模的数据。
基于牌型判断的算法则是通过对当前手牌进行牌型分析,分析出当前手牌可能的胡牌形式,然后再根据这些胡牌形式判断当前手牌是否能够胡牌。这种算法的优点是时间复杂度比较低,适合处理大规模的数据,但是实现起来比较困难。
需要根据具体的需求和场景选择合适的算法。
相关问题
c++ 贵阳麻将 胡牌算法
在贵阳麻将游戏中,判断胡牌需要遵循以下规则:
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`函数用于判断是否有将牌。
用c++实现一个最先进的胡牌算法
胡牌算法是麻将游戏中的重要算法之一,下面是一个基于C++的最先进的胡牌算法实现:
首先,我们需要定义麻将牌的数据结构,可以使用一个整数数组表示麻将牌的数量。例如,数组中第一个元素表示1万的数量,第二个元素表示2万的数量,以此类推。
```cpp
int tiles[34] = {0}; // 麻将牌数量
```
接下来,我们需要判断是否胡牌。对于这个问题,我们可以使用递归算法来解决。具体来说,我们可以先找到所有可以组成顺子、刻子和将牌的牌,然后递归判断剩余的牌是否可以胡牌。如果所有的牌都被组成了顺子、刻子和将牌,那么就说明可以胡牌。
```cpp
bool canHu() {
for (int i = 0; i < 34; i++) {
if (tiles[i] >= 2) {
tiles[i] -= 2;
if (canHu()) {
tiles[i] += 2;
return true;
}
tiles[i] += 2;
}
}
for (int i = 0; i < 34; i++) {
if (i % 9 <= 6 && tiles[i] > 0 && tiles[i + 1] > 0 && tiles[i + 2] > 0) {
tiles[i]--;
tiles[i + 1]--;
tiles[i + 2]--;
if (canHu()) {
tiles[i]++;
tiles[i + 1]++;
tiles[i + 2]++;
return true;
}
tiles[i]++;
tiles[i + 1]++;
tiles[i + 2]++;
}
}
for (int i = 0; i < 34; i++) {
if (tiles[i] >= 3) {
tiles[i] -= 3;
if (canHu()) {
tiles[i] += 3;
return true;
}
tiles[i] += 3;
}
}
for (int i = 0; i < 34; i++) {
if (tiles[i] == 2) {
tiles[i] -= 2;
if (canHu()) {
tiles[i] += 2;
return true;
}
tiles[i] += 2;
}
}
return false;
}
```
最后,我们可以编写一个测试函数来测试我们的胡牌算法是否正确。
```cpp
bool test() {
// 测试用例
int testcase[34] = {1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9};
for (int i = 0; i < 34; i++) {
tiles[i] = testcase[i];
}
return canHu();
}
```
参考文献:
1. https://www.cnblogs.com/lei2018/p/10116906.html
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)