题目描述 赛利有12枚银币。其中有11枚真币和1枚假币。假币看起来和真币没有区别,但是重量不同。但赛利不知道假币比真币轻还是重。于是他向朋友借了一架天平。朋友希望赛利称三次就能找出假币并且确定假币是轻是重。例如:如果赛利用天平称两枚硬币,发现天平平衡,说明两枚都是真的。如果赛利用一枚真币与另一枚银币比较,发现它比真币轻或重,说明它是假币。经过精心安排每次的称量,赛利保证在称三次后确定假币。输入 第一行有一个数字n,表示有n组测试数据。对于每组测试数据: 输入有三行,每行表示一次称量的结果。赛利事先将银币标号为A-L。每次称量的结果用三个以空格隔开的字符串表示:天平左边放置的硬币 天平右边放置的硬币 平衡状态。其中平衡状态用“up”, “down”, 或 “even”表示, 分别为右端高、右端低和平衡。天平左右的硬币数总是相等的。输出 输出哪一个标号的银币是假币,并说明它比真币轻还是重(重或轻)。样例输入 复制 1 ABCD EFGH even ABCI EFJK up ABIJ EFGH even 样例输出 复制 K 是假币,它很轻。用C语言写代码
时间: 2023-12-14 13:38:04 浏览: 191
poj2696.rar_12枚硬币_12硬币问题_称硬币
```c
#include <stdio.h>
#include <string.h>
char coins[12]; // 存放硬币状态
char status[5]; // 存放称量结果
// 比较函数,返回值为-1表示轻,1表示重,0表示平衡
int compare(char left[], char right[], char status[]) {
int left_sum = 0, right_sum = 0;
int len = strlen(left);
for (int i = 0; i < len; i++) {
left_sum += coins[left[i] - 'A'];
right_sum += coins[right[i] - 'A'];
}
if (left_sum < right_sum) {
return strcmp(status, "up") == 0 ? 1 : -1;
} else if (left_sum > right_sum) {
return strcmp(status, "up") == 0 ? -1 : 1;
} else {
return 0;
}
}
int main() {
int n;
scanf("%d", &n);
while (n--) {
memset(coins, 0, sizeof(coins)); // 初始化
for (int i = 0; i < 3; i++) {
char left[5], right[5];
scanf("%s%s%s", left, right, status);
if (strcmp(status, "even") == 0) { // 如果是平衡的,那么称量的硬币都是真币
int len = strlen(left);
for (int j = 0; j < len; j++) {
coins[left[j] - 'A'] = 1;
coins[right[j] - 'A'] = 1;
}
}
}
// 第三次称量,此时假币已经确定是轻还是重
for (int i = 0; i < 12; i++) {
if (coins[i] == 0) { // 如果这枚硬币是假币
coins[i] = -1; // 先假设假币比真币轻
// 检查是否能够确定假币比真币重
if (compare("ABEF", "CDGH", "up") == -1 && // ABEF比CDGH轻
compare("ABEF", "CDGH", "even") == 0 && // ABEF和CDGH平衡
compare("ABEF", "IJKL", "even") == 0 && // ABEF和IJKL平衡
compare("CDGH", "IJKL", "even") == 0 && // CDGH和IJKL平衡
compare("AEIM", "BFJN", "up") == -1 && // AEIM比BFJN轻
compare("AEIM", "BFJN", "even") == 0 && // AEIM和BFJN平衡
compare("AEIM", "CGKO", "even") == 0 && // AEIM和CGKO平衡
compare("BFJN", "CGKO", "even") == 0 && // BFJN和CGKO平衡
compare("AFKP", "BGLQ", "up") == -1 && // AFPK比BGLQ轻
compare("AFKP", "BGLQ", "even") == 0 && // AFPK和BGLQ平衡
compare("AFKP", "CHLQ", "even") == 0 && // AFPK和CHLQ平衡
compare("BGLQ", "CHLQ", "even") == 0) { // BGLQ和CHLQ平衡
coins[i] = 1; // 假币比真币重
}
break;
}
}
// 输出结果
for (int i = 0; i < 12; i++) {
if (coins[i] == -1) {
printf("%c is the counterfeit coin and it is light.\n", i + 'A');
break;
} else if (coins[i] == 1) {
printf("%c is the counterfeit coin and it is heavy.\n", i + 'A');
break;
}
}
}
return 0;
}
```
阅读全文