问题描述:
有12枚硬币。其中有11枚真币和1枚假币。假币和真币重量不同, 但不知道假币比真币轻还是重。现在用一架天平称了这些币三次,告诉你称的结果,请你找出假币并且确定假币是轻是重(数据保证一能找出来)。
输入
第一行是测试数据组数。
每组数据有三行,每行表示一次称量的结果。银币标号为A-L。每次称量的结果用三个以空格隔开的字符串表示:天平左边放置的硬币,天平右边放置的硬币平衡状态。其中平衡状态用"up",“down”,或"even"表示, 分别为右端高、右端低和平衡。天平左右的硬币数总是相等的。
输出
输出哪一个标号的银币是假币,并说明它比真币轻还是重。
输入样例
1
ABCD EFGH even
ABCI EFJK up
ABIJ EFGH even
输出样例
K is the counterfeit coin and it is light.
————————————————
版权声明:本文为CSDN博主「-出发-」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/happyjacob/article/details/86776634(原题目)
//称量硬币 #include#include using namespace std; char Left[3][7]; char Right[3][7]; char result[3][4];//存储左右天平以及测量结果 bool isfake(char c, bool r); //r为true,硬币是轻的,false,为重的 int main() { for (int i = 0; i < 3; i++) { cin >> Left[i] >> Right[i] >> result[i];//最开始设置的是left[3][7],right[3][7],输入的时候,visual stdio就显示“不明确” } for(char c='a';c<='l';c++) { if (isfake(c, true))//假设的两种可能 cout << "假的硬币:" << c << "轻的"; else if(isfake(c,false)) cout << "假的硬币:" << c << "重的"; } return 0; } bool isfake(char c, bool r) { char* pl, * pr; for (int i = 0; i < 3; i++) { if (r)//清的 { pl = Left[i]; pr = Right[i]; } else { pl = Right[i]; pr = Left[i]; } switch (result[i][0]) { case 'u'://左边重 if (strchr(pr, c) == NULL) return false; break; case 'd': if (strchr(pl, c) == NULL) return false; break; case 'e': if (strchr(pr, c) == NULL || strchr(pl, c) == NULL) return false; break; } } return 0; }
附:
strchr(const char *s,char v);
查找字符串s中首次出现字符v的位置,返回s中v及其之后的字符



