请用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”;否则输出“BUHU”
时间: 2024-03-13 14:45:42 浏览: 88
好的,下面是C++的实现代码,希望能够帮到你:
```c++
#include <iostream>
#include <algorithm>
using namespace std;
bool isHupai(int a[], int n) {
bool b[10];
int i, j, k, l, m, t;
if (n != 8 && n != 11 && n != 14) { // 不符合元素个数要求
return false;
}
sort(a, a + n);
do {
for (i = 0; i < n; i += 3) { // 判断3个一组是否合法
if (a[i] == a[i + 1] && a[i + 1] == a[i + 2]) {
continue;
}
if (a[i] + 1 == a[i + 1] && a[i + 1] + 1 == a[i + 2]) {
continue;
}
break;
}
if (i != n) {
continue;
}
memset(b, 0, sizeof(b));
for (i = 0; i < n; i++) { // 判断2个一组是否合法
if (b[a[i]]) { // 出现重复数字
break;
}
b[a[i]] = true;
}
if (i != n) {
continue;
}
for (i = 0; i < n; i++) {
for (j = i + 1; j < n; j++) {
if (a[i] == a[j]) {
for (k = j + 1; k < n; k++) {
if (a[k] == a[i]) {
for (l = k + 1; l < n; l++) {
if (a[l] == a[i]) {
return false; // 出现4个一样的数字
}
}
} else {
for (l = k + 1; l < n; l++) {
if (a[k] == a[l] || a[l] == a[i]) {
continue;
}
for (m = l + 1; m < n; m++) {
if (a[k] == a[m] || a[l] == a[m] || a[m] == a[i]) {
continue;
}
t = a[k] * 100 + a[l] * 10 + a[m];
if (t % 3 == 0 && t / 3 == a[i] * 10 + a[j]) {
break;
}
}
if (m == n) {
break;
}
}
if (l < n) {
break;
}
}
}
if (k < n) {
break;
}
}
}
if (j < n) {
break;
}
}
if (i == n) {
return true;
}
} while (next_permutation(a, a + n));
return false;
}
int main() {
int a[14];
while (true) {
int n = 0;
while (true) { // 输入元素
cin >> a[n];
if (a[n] == 0) {
return 0;
}
n++;
if (n == 14) {
break;
}
}
if (n == 14) {
cout << "XIANGGONG" << endl;
continue;
}
if (isHupai(a, n)) {
cout << "HU" << endl;
} else {
cout << "BUHU" << endl;
}
}
return 0;
}
```
阅读全文