WUST Online Judge - 2102: 称硬币
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.\n", c); break; } else if (f(c, 1, str1, str2, str3, str)) { printf("%c is the counterfeit coin and it is heavy.\n", c); break; } } } return 0; }
作者:McR
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。