• Java实现 泊松分酒


    泊松是法国数学家、物理学家和力学家。他一生致力科学事业,成果颇多。有许多著名的公式定理以他的名字命名,比如概率论中著名的泊松分布。

    有一次闲暇时,他提出过一个有趣的问题,后称为:“泊松分酒”。在我国古代也提出过类似问题,遗憾的是没有进行彻底探索,其中流传较多是:“韩信走马分油”问题。

    有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

    每一行表示一个操作过程中的油量状态。

    注意:

    请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!

    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class Main {
        public static ArrayList<String> set = new ArrayList<String>();
        public static int[] maxN = new int[3];
        public static int[] N = new int[3];
        public static int ans;
        public static int count = 0;
        
        //某start瓶向end瓶中倒
        public void getOnetoAnother(int start, int end) {
            if(N[start] == 0)
                return;
            if(maxN[end] > N[end]) {
                int low = maxN[end] - N[end];
                int temp1 = N[start], temp2 = N[end];
                if(low >= N[start]) {
                    N[end] = N[end] + N[start];
                    N[start] = 0;
                } else {
                    N[end] = maxN[end];
                    N[start] = N[start] - low;
                }
                StringBuffer s = new StringBuffer("");
                s.append(N[0]);
                s.append(",");
                s.append(N[1]);
                s.append(",");
                s.append(N[2]);
                if(!set.contains(s.toString())) {
                    set.add(s.toString());
                    count++;
                } else {
                    N[start] = temp1;
                    N[end] = temp2;
                }
            }
        }
        
        public boolean check() {
            if(N[0] == ans || N[1] == ans || N[2] == ans) {
                for(String s : set)
                    System.out.println(s);
                return true;
            }
            return false;
        }
        
        public void getResult() {
            int max = Math.max(maxN[0], Math.max(maxN[1], maxN[2]));
            if(ans > max) {
                System.out.println("不可能");
                return;
            }
            while(true) {
                int temp = count;
                //A瓶向B瓶倒
                getOnetoAnother(0, 1);
                if(check())
                    break;
                //B瓶向C瓶倒
                getOnetoAnother(1, 2);
                if(check())
                    break;
                //C瓶向A瓶倒
                getOnetoAnother(2, 0);
                if(check())
                    break;
                //A瓶向C瓶倒
                getOnetoAnother(0, 2);
                if(check())
                    break;
                //C瓶向B瓶倒
                getOnetoAnother(2, 1);
                if(check())
                    break;
                //B瓶向A瓶倒
                getOnetoAnother(1, 0);
                if(check())
                    break;    
                temp = count - temp;
                if(temp == 0) {
                    System.out.println("不可能");
                    return;
                }
            }
        }
        
        public static void main(String[] args) {
            Main test = new Main();
            Scanner in = new Scanner(System.in);
            String S = in.next();
            String[] arrayS = S.split(",");
            for(int i = 0;i < 3;i++)
                maxN[i] = Integer.valueOf(arrayS[i]);
            for(int i = 3;i < 6;i++)
                N[i - 3] = Integer.valueOf(arrayS[i]);
            ans = Integer.valueOf(arrayS[6]);
            StringBuffer s = new StringBuffer("");
            s.append(N[0]);
            s.append(",");
            s.append(N[1]);
            s.append(",");
            s.append(N[2]);
            set.add(s.toString());
            test.getResult();
        }
    }
    

    运行结果:

    测试用例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
    
  • 相关阅读:
    解决GIT可视化工具Sourcetree拉取失败问题
    记录常用Git命令
    vue开发移动端使用rem的适配方案
    使用HBuilderX实现打包vue项目成app
    使用vue+webpack从零搭建项目
    整理最近面试问道的问题
    模块化之seaJs学习和使用
    理解Object.defineProperty的作用
    vue生命周期
    使用gulp编译sass
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13077669.html
Copyright © 2020-2023  润新知