【题目】
萨莉·琼斯有一打旅行者银元硬币(一打指十二个)。
其中的十一个硬币是真币,还有一个是假币。
假币的颜色和大小与真币并无差别,但是重量上与真币不同。
遗憾的是,萨莉并不清楚假币是更重还是更轻。
幸好,她的朋友借给了她一个非常精准的天平。
朋友允许她进行三次称重,来找到假币的存在。
举例说明,如果她将两个硬币放置在天平两端,天平保持平衡,则说明两个硬币都是真的。
然后用一个真币和第三个硬币称重比较,如果天平不平衡,则确定第三个硬币是假币,并且根据天平的高低,也可判断假币是更轻还是更重。
通过合理安排,她确定可以通过三次称重找到假币的存在。
输入格式
共三行,每行描述一次称重。用大写字母 A∼L
对 12
个硬币分别标号,用天平右端的倾斜程度来描述称重结果。
每行首先包含两个大写字母构成的字符串,分别表示左右两端的硬币(两端的硬币数量一定相同),然后包含一个单词 up,down 或 even,表示天平右端的倾斜程度。
输出格式
输出占一行,格式为 XX is the counterfeit coin and it is XXX.,其中 XX 是假币的字母编号,XXX 用来形容它更轻还是更重,更轻用 light 表示,更重 heavy 表示。
数据范围
保证一定有解。
输入样例:
ABCD EFGH even
ABCI EFJK up
ABIJ EFGH even
输出样例:
K is the counterfeit coin and it is light.
【解题思路】
本题直接暴力枚举,逐个判断,对三个条件判断时使用continue和break对是否符合三个条件进行判断,思路理清就行。
【AC代码】
#include<iostream>
using namespace std;
typedef struct weight {
string left;
string right;
string condition;
}weight;
int main() {
ios::sync_with_stdio(false);
weight w[3];
for (int i = 0; i < 3; i++)
cin >> w[i].left >> w[i].right >> w[i].condition;
char x = 'A';
for (int i = 0; i < 12; i++) {
int u = 0; //u用来判断每次枚举符合的条件数
int g = 0; //g用来判断假币轻重,1为重,-1为轻,初值为0
for (; u < 3; u++) {
if (w[u].condition == "even") {
if ((w[u].left.find(x) != string::npos && w[u].right.find(x) != string::npos)
|| (w[u].left.find(x) == string::npos && w[u].right.find(x) == string::npos))
continue;
else
break;
}
else {
if ((w[u].left.find(x) == string::npos && w[u].right.find(x) == string::npos)
|| (w[u].left.find(x) != string::npos && w[u].right.find(x) != string::npos))
break;
if (w[u].condition == "down") {
if (g == 0) {
g = (w[u].left.find(x) == string::npos) ? 1 : -1;
continue;
}
else if (g == -1) {
if (w[u].left.find(x) == string::npos)
break;
else
continue;
}
else if (g == 1) {
if (w[u].left.find(x) == string::npos)
continue;
else
break;
}
}
if (w[u].condition == "up") {
if (g == 0) {
g = (w[u].left.find(x) == string::npos) ? -1 : 1;
}
else if (g == -1) {
if (w[u].left.find(x) == string::npos)
continue;
else
break;;
}
else if (g == 1) {
if (w[u].left.find(x) == string::npos)
break;
else
continue;
}
}
}
}
if (u == 3) {
string t = (g == 1) ? "heavy" : "light";
cout << x <<" is the counterfeit coin and it is "<<t<<".";
break;
}
x = char(x + 1);
}
return 0;
}