题目:有12枚硬币,其中有11枚真币和一枚假币。假币和真币不同但不知道假币比真币轻还是重。现在,用一架天平称了这些币三次,告诉你称的结果,请你找出假币,并且确定假币是轻是重(数据保证一定能找出来)
#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);//假设c为假币,是轻的,反之假币是重的
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(pright, c) || strchr(pleft, c)) return false;
break;
case 'd':
if (strchr(pleft, c) == NULL) return false;
break;
}
}
return true;
}