用c语言编写,三对母子参加电视台亲子游戏,三个母亲分别为ABC,三个孩子分别为XYZ,主持人不知道谁和谁是母子,于是询问了六个人中的三个,听到的回答是:A说他的孩子是X;X说他的妈妈是C;C说X是他的孩子。但是他们三个说的都是假话,请用c语言分析正确的母子关系。
时间: 2023-12-14 21:36:40 浏览: 557
基于c语言的一个答题小游戏
为了分析正确的母子关系,我们可以列出每个人可能是母亲和孩子的情况,然后根据三个人的回答来排除不可能的情况。最后剩下的一组就是正确的母子关系。
首先,我们定义母亲和孩子的编号:
```
#define M_A 0
#define M_B 1
#define M_C 2
#define C_X 3
#define C_Y 4
#define C_Z 5
```
然后,我们可以用一个数组来表示每个人可能是母亲和孩子的情况:
```
int rel[6][2] = {
{M_A, C_X},
{M_B, C_X},
{M_C, C_X},
{M_A, C_Y},
{M_B, C_Y},
{M_C, C_Y},
};
```
接下来,我们可以用一个函数来判断一个人是否说了假话:
```
bool is_lie(int person, int *known) {
int i;
for (i = 0; i < 3; i++) {
if (known[i] == person) {
return false; // 已知的信息是真的
}
}
if ((person == M_A && rel[person][1] != C_X) ||
(person == C_X && rel[person][0] != M_A) ||
(person == M_B && rel[person][1] != C_Y) ||
(person == C_Y && rel[person][0] != M_B) ||
(person == M_C && rel[person][1] != C_Z) ||
(person == C_Z && rel[person][0] != M_C)) {
return false; // 自己的说法是假的
}
return true;
}
```
这个函数接受一个参数 `person` 表示要判断的人,和一个参数 `known` 表示已知的三个人的编号。如果 `person` 说的话在已知信息中为真,则返回 false,否则就判断他自己的说法是否为假,如果是假的,则返回 true。
接下来,我们可以用一个函数来枚举所有可能的情况,并找出正确的母子关系:
```
void find_relation() {
int i, j, k;
for (i = 0; i < 6; i++) {
for (j = 0; j < 6; j++) {
for (k = 0; k < 6; k++) {
if (i != j && i != k && j != k) {
int known[3] = {i, j, k};
if (is_lie(i, known) && is_lie(j, known) && is_lie(k, known)) {
// 找到了正确的母子关系
printf("Mother:\n");
printf("%c\n", 'A' + rel[i][0]);
printf("%c\n", 'A' + rel[j][0]);
printf("%c\n", 'A' + rel[k][0]);
printf("Child:\n");
printf("%c\n", 'X' + rel[i][1] - C_X);
printf("%c\n", 'X' + rel[j][1] - C_X);
printf("%c\n", 'X' + rel[k][1] - C_X);
return;
}
}
}
}
}
}
```
这个函数枚举所有可能的情况,并调用 `is_lie` 函数判断每个人是否说了假话。如果三个人的话都是假的,则找到了正确的母子关系,输出结果。
最后,我们在主函数中调用 `find_relation` 函数即可:
```
int main() {
find_relation();
return 0;
}
```
完整的代码如下:
阅读全文