称硬币
有12枚硬币。其中有11枚真币和1枚假币。假币和真
币重量不同,但不知道假币比真币轻还是重。现在,
用一架天平称了这些币三次,告诉你称的结果,请你
找出假币并且确定假币是轻是重(数据保证一定能找
出来)。
输入
第一行是测试数据组数。
每组数据有三行,每行表示一次称量的结果。银币标号
为A-L。每次称量的结果用三个以空格隔开的字符串表示:
天平左边放置的硬币 天平右边放置的硬币 平衡状态。其
中平衡状态用up'',
down’’, 或 even''表示, 分 别为右端高、右端低和平衡。天平左右的硬币数总是相等 的。 输出 输出哪一个标号的银币是假币,并说明它比真币轻还是重。 例题:POJ1013 称硬币 输入样例 1 ABCD EFGH even ABCI EFJK up ABIJ EFGH even 输出样例 K is the counterfeit coin and it is light. 例题:POJ1013 称硬币 解题思路 先假定不平衡中的都是假
币并确定轻重,再逐个扫描查证,最后剩下的是假币。
```cpp
#include<iostream>
using namespace std;
char Left[3][7],Right[3][7],Result[3][7]; //3个2维数组分别存放天平左右和结果
char IsFake(char c ){ //返回称量结果 重就是'H' ,轻就是'L' ,真币返回0;
char r=0;
for(int i=0;i<3;++i){
for(int j=0;j<=3;++j){
if(Result[i][0]=='U'){
if(Left[i][j]==c)r='H'; //出现这种情况先假设这个硬币为重的
if(Right[i][j]==c)r='L';
}
if(Result[i][0]=='D'){
if(Left[i][j]==c)r='L';
if(Right[i][j]==c)r='H';
}
}
}
for(int i=0;i<3;++i)
for(int j=0;j<=3;++j){
if(Result[i][0]=='E'&&(Left[i][j]==c||Right[i][j]==c))r=0;//天平平衡而有该硬币出现,更正结果为0
if(r=='H' && Result[i][0]=='U' && Right[i][j]==c)r=0; //如果假设是重的且天平上翘而该硬币出现在右边,就否定假设,
if(r=='L' && Result[i][0]=='D' && Left[i][j]==c)r=0;
}
return r;
}
int main(){
int t;
cin>>t;
//freopen("d\\cyb.txt","r",stdin);
while(t--){
for(int i=0;i<3;++i)
cin>>Left[i]>>Right[i]>>Result[i];
for(char c='A';c<='L';c++){
char r=IsFake(c);
if(r=='L')cout<<c<<" is the counterfeit coin and it is light.\n";
if(r=='H')cout<<c<<" is the counterfeit coin and it is heavy.\n";
}
}
return 0;
}
野人时代
发布了5 篇原创文章 · 获赞 0 · 访问量 59
私信
关注