算法筆記_219:泊松分酒(Java)
阿新 • • 發佈:2017-05-23
ava import 輸入 block -s 數學 步驟 ner 命名
12,0,0
4,8,0
4,3,5
9,3,0
9,0,3
1,8,3
1,6,5
目錄
1 問題描述
2 解決方案
1 問題描述
泊松是法國數學家、物理學家和力學家。他一生致力科學事業,成果頗多。有許多著名的公式定理以他的名字命名,比如概率論中著名的泊松分布。
有一次閑暇時,他提出過一個有趣的問題,後稱為:“泊松分酒”。在我國古代也提出過類似問題,遺憾的是沒有進行徹底探索,其中流傳較多是:“韓信走馬分油”問題。
有3個容器,容量分別為12升,8升,5升。其中12升中裝滿油,另外兩個空著。要求你只用3個容器操作,最後使得某個容器中正好有6升油。
下面的列表是可能的操作狀態記錄:
12,0,0
4,8,0
4,3,5
9,3,0
9,0,3
1,8,3
1,6,5
每行3個數據,分別表示12,8,6升容器中的油量
第一行表示初始狀態,第二行表示把12升倒入8升容器後的狀態,第三行是8升倒入5升,...
當然,同一個題目可能有多種不同的正確操作步驟。
本題目的要求是,請你編寫程序,由用戶輸入:各個容器的容量,開始的狀態,和要求的目標油量,程序則通過計算輸出一種實現的步驟(不需要找到所有可能的方法)。如果沒有可能實現,則輸出:“不可能”。
例如,用戶輸入:
12,8,5,12,0,0,6
用戶輸入的前三個數是容器容量(由大到小),接下來三個數是三個容器開始時的油量配置,最後一個數是要求得到的油量(放在哪個容器裏得到都可以)
則程序可以輸出(答案不唯一,只驗證操作可行性):
12,0,0
4,8,0
4,3,5
9,3,0
9,0,3
1,8,3
1,6,5
每一行表示一個操作過程中的油量狀態。
註意:
請仔細調試!您的程序只有能運行出正確結果的時候才有機會得分!
2 解決方案
1 import java.util.ArrayList; 2 import java.util.Scanner; 3 4 public class Main { 5 public static ArrayList<String> set = new ArrayList<String>();6 public static int[] maxN = new int[3]; 7 public static int[] N = new int[3]; 8 public static int ans; 9 public static int count = 0; 10 11 //某start瓶向end瓶中倒 12 public void getOnetoAnother(int start, int end) { 13 if(N[start] == 0) 14 return; 15 if(maxN[end] > N[end]) { 16 int low = maxN[end] - N[end]; 17 int temp1 = N[start], temp2 = N[end]; 18 if(low >= N[start]) { 19 N[end] = N[end] + N[start]; 20 N[start] = 0; 21 } else { 22 N[end] = maxN[end]; 23 N[start] = N[start] - low; 24 } 25 StringBuffer s = new StringBuffer(""); 26 s.append(N[0]); 27 s.append(","); 28 s.append(N[1]); 29 s.append(","); 30 s.append(N[2]); 31 if(!set.contains(s.toString())) { 32 set.add(s.toString()); 33 count++; 34 } else { 35 N[start] = temp1; 36 N[end] = temp2; 37 } 38 } 39 } 40 41 public boolean check() { 42 if(N[0] == ans || N[1] == ans || N[2] == ans) { 43 for(String s : set) 44 System.out.println(s); 45 return true; 46 } 47 return false; 48 } 49 50 public void getResult() { 51 int max = Math.max(maxN[0], Math.max(maxN[1], maxN[2])); 52 if(ans > max) { 53 System.out.println("不可能"); 54 return; 55 } 56 while(true) { 57 int temp = count; 58 //A瓶向B瓶倒 59 getOnetoAnother(0, 1); 60 if(check()) 61 break; 62 //B瓶向C瓶倒 63 getOnetoAnother(1, 2); 64 if(check()) 65 break; 66 //C瓶向A瓶倒 67 getOnetoAnother(2, 0); 68 if(check()) 69 break; 70 //A瓶向C瓶倒 71 getOnetoAnother(0, 2); 72 if(check()) 73 break; 74 //C瓶向B瓶倒 75 getOnetoAnother(2, 1); 76 if(check()) 77 break; 78 //B瓶向A瓶倒 79 getOnetoAnother(1, 0); 80 if(check()) 81 break; 82 temp = count - temp; 83 if(temp == 0) { 84 System.out.println("不可能"); 85 return; 86 } 87 } 88 } 89 90 public static void main(String[] args) { 91 Main test = new Main(); 92 Scanner in = new Scanner(System.in); 93 String S = in.next(); 94 String[] arrayS = S.split(","); 95 for(int i = 0;i < 3;i++) 96 maxN[i] = Integer.valueOf(arrayS[i]); 97 for(int i = 3;i < 6;i++) 98 N[i - 3] = Integer.valueOf(arrayS[i]); 99 ans = Integer.valueOf(arrayS[6]); 100 StringBuffer s = new StringBuffer(""); 101 s.append(N[0]); 102 s.append(","); 103 s.append(N[1]); 104 s.append(","); 105 s.append(N[2]); 106 set.add(s.toString()); 107 test.getResult(); 108 } 109 }
運行結果:
測試用例1: 12,8,5,12,0,0,6 12,0,0 4,8,0 4,3,5 9,3,0 9,0,3 7,0,5 7,5,0 2,5,5 2,8,2 10,0,2 10,2,0 5,2,5 5,7,0 0,7,5 0,8,4 8,0,4 8,4,0 3,4,5 3,8,1 11,0,1 11,1,0 6,1,5 測試用例2: 30,13,7,30,0,0,5 30,0,0 17,13,0 17,6,7 24,6,0 24,0,6 23,0,7 23,7,0 16,7,7 16,13,1 29,0,1 29,1,0 22,1,7 22,8,0 15,8,7 15,13,2 28,0,2 28,2,0 21,2,7 21,9,0 14,9,7 14,13,3 27,0,3 27,3,0 20,3,7 20,10,0 13,10,7 13,13,4 26,0,4 26,4,0 19,4,7 19,11,0 12,11,7 12,13,5 測試用例3: 31,19,11,31,0,0,5 31,0,0 12,19,0 12,8,11 23,8,0 23,0,8 20,0,11 20,11,0 9,11,11 9,19,3 28,0,3 28,3,0 17,3,11 17,14,0 6,14,11 6,19,6 25,0,6 25,6,0 14,6,11 14,17,0 3,17,11 3,19,9 22,0,9 22,9,0 11,9,11 11,19,1 30,0,1 30,1,0 19,1,11 19,12,0 8,12,11 8,19,4 27,0,4 27,4,0 16,4,11 16,15,0 5,15,11 測試用例4: 65,33,12,65,0,0,18 65,0,0 32,33,0 32,21,12 44,21,0 44,9,12 56,9,0 56,0,9 53,0,12 53,12,0 41,12,12 41,24,0 29,24,12 29,33,3 62,0,3 62,3,0 50,3,12 50,15,0 38,15,12 38,27,0 26,27,12 26,33,6 59,0,6 59,6,0 47,6,12 47,18,0
算法筆記_219:泊松分酒(Java)