程序设计与算法(二)算法基础-郭炜 1.3.1 称硬币
有12枚硬币。其中有11枚真币和1枚假币。假币和真币重量不同,但不知道假币比真币轻还是重。现在,用一架天平称了这些币三次,告诉你称的结果,请你找出假币并且确定假币是轻是重(数据保证一定能找出来)。
输入样例:
ABCD EFGH even
ABCI EFJK upABIJ EFGH even
输出样例:
K is the counterfeit coin and it is light.
注意:天平左右的硬币数总是相等的
c++代码如下:
#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);
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;
}
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;
}