题目大意是给你一打共计12枚硬币,其中一枚假冒伪劣重量有问题,其余是正常的。给你3次使用天平的机会,让你找出这枚硬币。
一开始我想了好久,打算用数组和数字加减等等分了好多种情况,觉得一道水题我想这么复杂肯定是走死胡同了,于是百度了一下别人的做法。果然图样,,,我的打算是通过每次测量两遍的总和来推断问题硬币的位置,然而我发现别人直接从一个个硬币分析轻重过去,更简洁,,,,orz
而且我发现 strchr(char a[],char x)我没见过啊,,,,学到了,,,,,原来是用来判断x出现在a[]中的位置,不在就NULL。。。。。
不说了,贴代码,说多了都是西湖水。。。。。。。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cstdio>
using namespace std;
char Left[3][7],Right[3][7],result[3][7];//分别存储天平左侧硬币,右侧硬币和结果
int is_heavy(char x){//判断是否偏重
int i;
for(i=0;i<3;i++){
if(result[i][0]=='e')
if(strchr(Left[i],x)!=NULL || strchr(Right[i],x)!=NULL) return 0;
if(result[i][0]=='u')
if(strchr(Left[i],x)==NULL) return 0;
if(result[i][0]=='d')
if(strchr(Right[i],x)==NULL) return 0;
}
return 1;
}
int is_light(char x){//判断是否偏轻
int i;
for(i=0;i<3;i++){
if(result[i][0]=='e')
if(strchr(Left[i],x)!=NULL || strchr(Right[i],x)!=NULL) return 0;
if(result[i][0]=='u')
if(strchr(Right[i],x)==NULL) return 0;
if(result[i][0]=='d')
if(strchr(Left[i],x)==NULL) return 0;
}
return 1;
}
int main(){
int i,n;
char x;
cin>>n;
while(n--){
for(i=0;i<3;i++){
scanf("%s %s %s",Left[i],Right[i],result[i]);
}
for(x='A';x<='L';x++){
if(is_light(x)){
printf("%c is the counterfeit coin and it is light.\n",x);
break;
}
if(is_heavy(x)){
printf("%c is the counterfeit coin and it is heavy.\n",x);
break;
}
}
}
return 0;
}