解题思路:
因为题目的编辑中已经是知道了最终结果的,所以,可以倒过来思考,通过知晓的结果来判断相对应的过程是否符合对应的猜想,简单来说就是,自己称重硬币的过程,是不是就是出题者的意图,所以,需要建立三个数组来存放相对应的称重数据,最后用枚举的办法,依次比对结果是不是符合,最终得出硬币的真假。
代码如下:
#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);
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;}}}return 0;
}bool IsFake(char c, bool 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;
}
存在的难点:
我觉得最难的就是自己设计的函数在判断完硬币的真假之后,需要再进一步的对下一步的称重结果进行对比,每次存储的数据都要更新,最后经过对比后才得出结果。