分酒
泊松是法國數學家、物理學家和力學家。他一生致力科學事業,成果頗多。有許多著名的公式定理以他的名字命名,比如機率論中著名的泊松分布。
有一次閑暇時,他提出過一個有趣的問題,後稱為:“泊松分酒”。在我國古代也提出過類似問題,遺憾的是沒有進行徹底探索,其中流傳較多是:“韓信走馬分油”問題。
有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
每一行表示一個操作過程中的油量狀態。
注意:
請仔細調試!您的程式只有能運行出正確結果的時候才有機會得分!
請把所有類寫在同一個檔案中,調試好後,存入與【考生檔案夾】下對應題號的“解答.txt”中即可。
相關的工程檔案不要拷入。
請不要使用package語句。
來源程式中只能出現JDK1.5中允許的文法或調用。不能使用1.6或更高版本。
思路:BFS(廣度優先搜尋
import java.io.*;import java.util.*;class Node{int max[];int v[];Node(){max=new int[3];v=new int[3];}public Node getNode(){Node node=new Node();for(int i=0;i<3;i++){node.max[i]=max[i];node.v[i]=v[i];}return node;}}/* * @author denghuilong * * 2013-8-13下午4:14:55 **/public class A10_1 {public boolean boo[]=new boolean[100*100*100+100*100+100];public Queue<Node> list=new LinkedList<Node>();public LinkedList<String> li;public int end;public static void main(String[] args) {new A10_1().work();}public void work(){Scanner sc=new Scanner(new BufferedInputStream(System.in));Arrays.fill(boo,false);list.clear();String s=sc.nextLine();String str[]=s.split(",");Node node=new Node();for(int i=0;i<3;i++){node.max[i]=Integer.parseInt(str[i]);}int j=0;for(int i=3;i<6;i++){node.v[j++]=Integer.parseInt(str[i]);}end=Integer.parseInt(str[6]);list.add(node);BFS();}public void BFS(){li=new LinkedList<String>();while(list.size()!=0){Node node=list.poll();for(int i=0;i<3;i++){for(int j=0;j<3;j++){if(i==j||node.max[j]==node.v[j])continue;Node t=node.getNode();if(t.v[i]>=(t.max[j]-t.v[j])){t.v[i]=t.v[i]-(t.max[j]-t.v[j]);t.v[j]=t.max[j];}else{t.v[j]=t.v[i]+t.v[j];t.v[i]=0;}int step=getStep(t);if(!boo[step]){boo[step]=true;list.add(t);li.addLast(getString(t));if(check(t)){for(int k=0;k<li.size();k++){System.out.println(li.get(k));}return;}}}}}System.out.println("不可能");}public String getString(Node node){return ""+node.v[0]+","+node.v[1]+","+node.v[2];}public int getStep(Node node){return node.v[0]*100*100+node.v[1]*100+node.v[2];}public boolean check(Node node){int s=node.v[0];int m=node.v[1];int n=node.v[2];if((s==end)||(m==end)||(n==end))return true;elsereturn false;}}