有12枚硬币。其中有11枚真币和1枚假币。假币和真币重量不同,但不知道假币比真币轻还是重。现在,用一架天平称了这些币三次,告诉你称的结果,请你找出假币并且确定假币是轻是重(数据保证一定能找出来)。
输入样例:
ABCD EFGH even
ABCI EFJK upABIJ EFGH even
输出样例:
K is the counterfeit coin and it is light.
题解:
题目的意思是找出假币,然后判断假币的重量与真币大小,但是想要找到
假币的方法是判定,所以我们应该一个一个枚举,利用假设法来判断
假设这是假币,看看是不是不满足三个条件,然后进行判断,如果都满足
那么就对了。
代码如下:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
char l[3][7],r[3][7];
char j[3][4];
bool isfake(char c,bool light);
int main() {
int t;
cin>>t;
while(t--) {
for(int i=0; i<3; i++) {
cin>>l[i]>>r[i]>>j[i];
}
for(char c='A'; c<'L'; c++) {
if (isfake(c, true))
{
cout << c << " is the counterfeit coin and it is light." << endl;
break;
}
if (isfake(c, false))
{
cout << c << " is the counterfeit coin and it is heavy." << endl;
break;
}
}
}
}
bool isfake(char c,bool light) {
for(int i=0; i<3; i++) {
char *pl,*pr;
if(light) {
pl=l[i];
pr=r[i];
} else {
pl=r[i];
pr=l[i];
}
switch(j[i][0]) {
case 'u':
if(strchr(pr,c)==NULL)
return false;
break;
case 'e':
if(strchr(pl,c)||strchr(pr,c))
return false;
break;
case 'd':
if(strchr(pl,c)==NULL)
return false ;
break;
}
}
return true;
}
代码是来自北京大学郭老师的算法基础课程例题解,
char *strchr(const char * _Str,char _Val)
功能:查找字符串_Str中首次出现字符_Val的位置
说明:返回首次出现_Val的位置的指针,返回的地址是被查找字符串指针开始的第一个与Val相同字符的指针,如果Str中不存在Val则返回NULL。
返回值:成功则返回要查找字符第一次出现的位置,失败返回NULL
本片作为作者本人使用笔记,他人勿喷。