2102: 称硬币
Time Limit: 1 Sec Memory Limit: 128 MB 64bit IO Format: %lld
Submitted: 242 Accepted: 32
[Submit][Status][Web Board]
Description
12 枚硬币,其中有11枚真币和1枚假币。假币和真币重量不同,但不知道假币比真币轻还是重。
现在用一架天平称了这些币三次,告诉你称的结果,请你找出假币并且确定是轻还是重(数据保证一能出来)。
Input
多组测试数据。每组测试数据有三行,表示一次称量的结果。硬币标号为 A-L。
每次称量的结果用三个以空格隔开字符串表示:天平左边放置的硬币 天平右边放置的硬币 平衡状态。
其中平衡状态用“up”,“down”,“even”表示,分别表示右端高、右端低和左右平衡。
天平左右的硬币数总是相等。
Output
每组测试数据在一行中输出哪一个标号的硬币是假币,并说明它比真币轻(light)还是重(heavy)。
Sample Input 
ABCD EFGH even ABCI EFJK up ABIJ EFGH even
Sample Output
K is the counterfeit coin and it is light.
代码如下:
#include <stdio.h>
#include <string.h>
int f(char c, int n, char str1[][10], char str2[][10], char str3[][10], char str[][10]) {
int i;
if (!n) {
for (i = 0; i < 3; i++) {
if (strcmp(str3[i], str[0]) == 0)
if (strchr(str2[i], c) == NULL) return 0;
if (strcmp(str3[i], str[1]) == 0)
if (strchr(str1[i], c) == NULL) return 0;
if (strcmp(str3[i], str[2]) == 0)
if(strchr(str1[i], c) || strchr(str2[i], c)) return 0;
}
}
else {
for (i = 0; i < 3; i++) {
if (strcmp(str3[i], str[0]) == 0)
if (strchr(str1[i], c) == NULL) return 0;
if (strcmp(str3[i], str[1]) == 0)
if (strchr(str2[i], c) == NULL) return 0;
if (strcmp(str3[i], str[2]) == 0)
if(strchr(str1[i], c) || strchr(str2[i], c)) return 0;
}
}
return 1;
}
int main() {
int i;
char c;
char str[3][10] = {"up", "down", "even"};
char str1[3][10], str2[3][10], str3[3][10];
while (scanf("%s %s %s %s %s %s %s %s %s", str1[0], str2[0], str3[0], str1[1], str2[1], str3[1], str1[2], str2[2], str3[2]) != EOF) {
fflush(stdin);
for (c = 'A'; c <= 'L' ;c++) {
if (f(c, 0, str1, str2, str3, str)) {
printf("%c is the counterfeit coin and it is light.
", c);
break;
}
else if (f(c, 1, str1, str2, str3, str)) {
printf("%c is the counterfeit coin and it is heavy.
", c);
break;
}
}
}
return 0;
}