网站自动seo,asp网站开发上传组建,京东网站建设流程和结构图,网页制作基础教程dw题目描述#xff1a;
有12枚硬币。其中有11枚真币和1枚假币。假币和真币重量不同#xff0c;但不知道假币比真币轻还是重。现在#xff0c;用一架天平称了这些币三次#xff0c;告诉你称的结果#xff0c;请你找出假币并且确定假币是轻是重#xff08;数据保证一定能找出…题目描述
有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. 解题思路
对于每一枚硬币先假设它是轻的看这样是否符合称量结果。如果符合问题即解决。如果不符合就假设它是重的看是否符合称量结果。把所有硬币都试一遍一定能找到特殊硬币。 代码如下
#include iostream
#include cstring
using namespace std;
char Left[3][7];//天平左边硬币
char Right[3][7]; //天平右边硬币
char result[3][7]; //结果bool IsFake(char c, bool light);
//light 为真表示假设假币为轻否则表示假设假币为重int main() {int t;cin t;while (t--) {for (int i 0; i 3; i) {cin Left[i] Right[i] result[i];}for (char c A; c L; c) {if (IsFake(c, true)) {cout c is the counterfeit coin and it is light.\n;break;}else if (IsFake(c, false)) {cout c is the counterfeit coin and it is heavy.\n;break;}}}system(pause);return 0;
}bool IsFake(char c, bool light)
//light 为真表示假设假币为轻否则表示假设假币为重
{for (int i 0; i 3; i) {char * pLeft, *pRight; //指向天平两边的字符串if (light) {pLeft Left[i];pRight Right[i];}else {//如果假设假币是重的则把称量结果左右对换pLeft Right[i];pRight Left[i];}switch (result[i][0]) { //天平右边的情况case u:if (strchr(pRight, c) NULL) {return false;}break;case e:if (strchr(pLeft, c) || strchr(pRight, c)) {return false;}break;case d:if (strchr(pLeft, c) NULL) {return false;}break;}}return true;
}