题名 假币问题
分析
解题思路
一共12枚银币,先都看作真币,再枚举,每次设其中一枚为假币(0代表真币,-1代表轻假币,1代表重假币(用数值表示方便后面计算重量));
每组测试用例会有三个条件,按条件称量天平左右两边各自的重量,最后判断是否跟条件结果一致,若三条件都满足,则此时设置的假币成立,输出。
数据结构
- 一个长度为12的int类型数组,用于标记12枚银币的真假状态;
- 将测试用例的条件输入
- 两个3行6列的char类型数组,分别存储三个条件称量时左右两边放的银币;(6列的原因:12枚银币,每边最多放6枚)
- 一个String类型数组,存储条件中的平衡结果;
- pdWeight方法——判断假设的假币是否满足三个条件(返回boolean类型)
- 计算重量,分别存入leftW和rightW;
- 比较计算结果,如果有一个不符合条件中的平衡结果,则返回false;
- 若三个条件都符合,则返回true;
- Main
- for循环12次,每次设一枚银币为假,一旦pdWeight方法返回true,则跳出循环,输出结果。(注 每次进入下一循环前,记得将上次设置的假币还原为真币)
代码如下
1 import java.io.*; 2 public class Main { 3 static int []status=new int [12];//储存每一枚硬币的真假状态,0真币,-1轻假币,1重假币 4 static char left[][]=new char[3][6],right[][]=new char[3][6]; 5 static String result[]=new String[3]; 6 //存贮天平两边的硬币编号(每边最多6个硬币),以及条件中的平衡状态(”up”,”down”或 ”even”分别表示右端高、右端低和平衡) 7 8 static boolean pdWeight(){ 9 int leftW=0,rightW=0; 10 for(int i=0;i<3;i++){ 11 //[注意]下面判断条件不能写j<6(main中赋值改变了数组长度);别忘记去除掉空值(否则‘0’-‘A’的数组下标会报错) 12 for(int j=0;j<left[i].length&&left[i][j]!='0';j++) 13 leftW+=status[left[i][j]-'A']; 14 for(int j=0;j<right[i].length&&right[i][j]!='0';j++) 15 rightW+=status[right[i][j]-'A']; 16 //比较计算的平衡结果和条件所给的平衡结果,若有不相符,返回false 17 if(leftW==rightW&&result[i].equals("even")==false)return false; 18 if(leftW>rightW&&result[i].equals("up")==false)return false; 19 if(leftW<rightW&&result[i].equals("down")==false)return false; 20 //[注]按下一条件计算前,别忘了将左右两边重量重设为0 21 leftW=rightW=0; 22 } 23 //三个条件都满足,返回true 24 return true; 25 } 26 27 public static void main(String[] args) throws IOException{ 28 // TODO 自动生成的方法存根 29 BufferedReader bf=new BufferedReader(new InputStreamReader(System.in)); 30 for(int n=Integer.parseInt(bf.readLine());n>0;n--){ //测试用例一个个来 31 for(int i=0;i<3;i++){ 32 String []str=bf.readLine().split(" "); 33 left[i]=str[0].toCharArray(); 34 right[i]=str[1].toCharArray(); 35 result[i]=str[2].toString(); 36 } 37 for(int i=0;i<12;i++)status[i]=0;//初始银币都设为真 38 int k=0; 39 //枚举,每次假设一枚银币为假 40 for(;k<12;k++){ 41 status[k]=-1; 42 if(pdWeight())break; 43 status[k]=1; 44 if(pdWeight())break; 45 status[k]=0;//[注]若都不成立,将该枚银币重设为真 46 } 47 System.out.println((char)(k+'A')+" is the counterfeit coin and it is "+((status[k]<0)?"light.":"heavy.")); 48 } 49 } 50 51 }
E . N . D