題名 假幣問題
分析
解題思路
一共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