POJ1013 称硬币
题目链接:POJ1013称硬币
题目大意
有12枚硬币。其中有11枚真币和1枚假币。假币和真币重量不同,但不知道假币比真币轻还是重。现在,用一架天平称了这些币三次,告诉你称的结果,请你找出假币并且确定假币是轻是重(数据保证一定能找出来)。
输入
第一行是测试数据组数。
每组数据有三行,每行表示一次称量的结果。银币标号为A-L。每次称量的结果用三个以空格隔开的字符串表示:天平左边放置的硬币、天平右边放置的硬币、平衡状态。其中平衡状态用``up'', ``down'', 或 ``even''表示, 分别为右端高、右端低和平衡。天平左右的硬币数总是相等的。
输出
输出哪一个标号的银币是假币,并说明它比真币轻还是重 。
输入样例
1
ABCD EFGH even
ABCI EFJK up
ABIJ EFGH even
输出样例
K is the counterfeit coin and it is light.
思路:
对于每一枚硬币进行枚举,先假设它是重的,然后带进条件中去试看是否符合,若不符合再假设它是轻的,再带进条件中试,经过多次循环尝试一定可以得出结果!
代码:
import java.util.Scanner;
public class 称硬币 {
static String left[] = new String[3];//天平左边
static String right[] = new String[3];//天平右边
static String result[] = new String[3];//称量结果
public static void test(){
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
for(int k=0; k<n; k++){
for(int i=0; i<3; i++){
left[i] = scan.next();//天平左边
right[i] = scan.next();//天平右边
result[i] = scan.next();//称量结果
}
for(char c='A'; c<='L'; c++){
if(IsFake(c, true)){//假设为轻
System.out.println(c+" is the counterfeit coin and it is light");
break;
}
else if(IsFake(c, false)){//假设为重
System.out.println(c+" is the counterfeit coin and it is heavy");
break;
}
}
}
}
public static boolean IsFake(char c, boolean light){
String lf,rt;//代表左右硬币
//light表示轻
for(int i=0; i<3; i++){
if(light){
lf = left[i];
rt = right[i];
}else{//如果硬币是重的,则交换左右的称量结果
lf = right[i];
rt = left[i];
}
switch (result[i].charAt(0)) {
case 'U': //右边升起的情况
if(rt.indexOf(c)==-1){
return false;
}
break; //左边升起的情况
case 'D':
if(lf.indexOf(c)==-1){
return false;
}
break;
case 'E': //平衡的情况
if(lf.indexOf(c)!=-1 || rt.indexOf(c)!=-1){
return false;
}
break;
default:
break;
}
}
return true;
}
public static void main(String[] args) {
test();
}
}