用c++语言实现下面的题目的具体代码 总时间限制:1000ms内存限制:65536kB 对于一个元素为数字1-9的集合A (每个数字的数量不超过4个,集合中元素的数量不超过14个),判断其是否满足如下规则: 集合A可以分割为若干个由3个数字组成的集合Bo..Bn和一个由2个数字组成的集合C。其中Bo..Bn需要满足每个集合中的数字均相等或者依次递增一(例如555以及456均满足条件):C中的两个数字相等 显然,当集合中的元素个数等于3n+2(n=0,1..4)时才有可能满足上述条件,我们将元素个数不为3n+2的集合称为“相公的集合,满足上述条件的集合称为能够“胡”的集合,否则则是“不胡”的集合。 输入 输入的每一行包括一组测试数据,测试数据的开头为0表示测试结束;每一组数据由若干个1-9的数字组成,数字之间用空格隔开。 输出 每一行输出对应一行输入的结果,对于“相公的集合输出“XIANGGONG ;对于满足“胡”的集合,输出“HU”;否则输出 B∪H∪。 样例输入 1 2 4 4 1 1 1 2 3 4 5 6 7 8 9 9 9 1 1 1 2 3 4 5 6 7 8 9 9 9 9 0 样例输出 BUHU HU XIANGGONG HU
时间: 2024-03-13 07:45:26 浏览: 61
很好,这是一道经典的麻将判断题目。下面是C++语言的代码实现:
```c++
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 14;
int a[N], b[N];
bool check()
{
for (int i = 0; i < N; i++)
if (a[i] > 4)
return false;
for (int i = 0; i < N; i++)
if (a[i])
{
int j = i;
while (j < N && a[j] && j - i < 2) j++;
if (j - i >= 3) i = j - 1;
else return false;
}
int cnt = 0;
for (int i = 0; i < N; i++)
if (a[i]) b[cnt++] = a[i];
if (cnt != 2) return false;
return b[0] == b[1];
}
int main()
{
while (true)
{
memset(a, 0, sizeof a);
int t;
while (cin >> t, t)
a[t - 1]++;
if (!a[0]) break;
bool flag = false;
for (int i = 0; i < N; i++)
if (a[i])
{
a[i]--;
if (check())
{
flag = true;
break;
}
a[i]++;
}
if (flag) puts("HU");
else if (accumulate(a, a + N, 0) % 3 == 2) puts("BUHU");
else puts("XIANGGONG");
}
return 0;
}
```
代码思路如下:
1. 首先输入麻将的牌型,用数组 `a` 统计每个数字出现的次数。
2. 判断输入的牌型是否满足胡牌的条件:
- 任意数字出现次数不超过4次;
- 集合中每个数字都相等,或者依次递增1;
- 集合中的数字个数为3的倍数加2;
- 集合中可以分出若干个由3个数字组成的集合Bo..Bn和一个由2个数字组成的集合C,其中Bo..Bn需要满足每个集合中的数字均相等或者依次递增一,C中的两个数字相等。
3. 如果输入的麻将牌型满足胡牌条件,则输出 `HU`;
4. 如果输入的麻将牌型不满足胡牌条件,但是牌型中的数字个数为3的倍数加2,则输出 `BUHU`;
5. 如果输入的麻将牌型不满足胡牌条件,且数字个数不为3的倍数加2,则输出 `XIANGGONG`。
以上就是代码实现和思路解析,希望能够帮助到你!
阅读全文