練習題 | 假幣問題


題名  假幣問題

 

分析 

解題思路

一共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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM