对于一个元素为数字1-9的集合A(每个数字的数量不超过4个,集合中元素的数量不超过14个),判断其是否满足如下规则: 集合A可以分割为若干个由3个数字组成的集合Bo...Bn和一个由2个数字组成的集合C。其中Bo...Bn需要满足每个集合中的数字均相等或者依次递增一(例如5 5 5以及4 5 6均满足条件);C中的两个数字相等 显然,当集合中的元素个数等于3n+2(n=0,1..4)时才有可能满足上述条件,我们将元素个数不为3n+2的集合称为“相公”的集合,满足上述条件的集合称为能够“胡”的集合,否则则是“不胡”的集合 输入 输入的每一行包括一组测试数据,测试数据的开头为0表示测试结束;每一组数据由若干个1-9的数字组成,数字之间用空格隔开 输出 每一行输出对应一行输入的结果,对于“相公”的集合输出“XIANGGONG”;对于满足“胡”的集合,输出“HU”;否则输出“BUHU"用c语言
时间: 2024-03-17 13:46:05 浏览: 11
以下是C语言实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int is_valid_seq(int seq[], int n) {
/*
* 判断一个序列是否满足Bo...Bn中每个集合中的数字均相等或者依次递增一的条件
*/
if (n == 1) {
return 1;
}
for (int i = 1; i < n; i++) {
if (seq[i] - seq[i-1] != 1) {
return 0;
}
}
return 1;
}
int is_hu(int nums[], int n) {
/*
* 判断一个序列是否满足能够“胡”的条件
*/
if (n % 3 != 2) {
return 0;
}
if (n == 2) {
return nums[0] == nums[1];
}
int *seq = malloc(sizeof(int) * n);
memcpy(seq, nums, sizeof(int) * n);
qsort(seq, n, sizeof(int), cmp);
for (int i = 0; i < n / 3; i++) {
if (!is_valid_seq(seq+i*3, 3)) {
free(seq);
return 0;
}
}
int res = is_valid_seq(seq+n-2, 2);
free(seq);
return res;
}
int main() {
int nums[14];
while (1) {
int n = 0;
while (1) {
scanf("%d", &nums[n]);
if (nums[n] == 0) {
return 0;
}
n++;
if (n == 14) {
break;
}
}
if (n % 3 != 2) {
printf("XIANGGONG\n");
} else if (is_hu(nums, n)) {
printf("HU\n");
} else {
printf("BUHU\n");
}
}
return 0;
}
```
代码中,`is_valid_seq`函数判断一个序列是否满足Bo...Bn中每个集合中的数字均相等或者依次递增一的条件,`is_hu`函数判断一个序列是否满足能够“胡”的条件。主程序中,循环读入输入,根据不同情况输出对应结果。注意,为了使用C语言的qsort函数对数组进行排序,需要编写一个比较函数cmp。