[蓝桥杯][java]海盗分酒

来源:互联网 发布:深圳哪里有淘宝拍摄的 编辑:程序博客网 时间:2024/04/27 20:20
 /*
 * 有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 
 * 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。
    等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”
    请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。
    如果有多个可能的答案,请列出所有答案,每个答案占一行。
    格式是:人数,人数,...
    例如,有一种可能是:20,5,4,2,0
    答案写在“解答.txt”中,不要写在这里!
    
 [解题思路]
 此题有如下几个特点:
 1. 次数是固定的,总共有4次
 2. 最后一轮的人(包括海盗船长的饮酒量是确定的,就是一瓶)
 3. 每次都是一瓶酒平分,每次饮酒的人,包括海盗船长,的饮酒量都是1/当前轮次中的总人数
 4. 初始人数不确定,仅知道不可能多于20人
 
 本题最适合采用逆向的递归来实现
 1. 设置一个数组,下标从0开始,其中的每个元素的内容表示每轮的人数
 2. 初始值为0,保存在下标为0的元素中.
 3. 由后向前逆推,每欠尝试上一轮的人数,尝试时有这样的一些准则:
     1) 上一轮的人数必须比本轮的人数多
     2) 上一轮人数不可能多于20人
 4. 递归结束的条件:
    1)到达了下标为4的元素
    2)当前元素中的值不大于20
    3)数组中前5位值的总和为1
5. 递归递进的条件
    1) 当前的下标不为4
    
 
 [解题流程]
     1. 接受当前的人数数组
     2. 接受当前的下标值
     3. 接受起始的人数值
     4. 从当前起始的人数值开始计算,循环尝试到20
                                 每取一个值时,判断当前下标是否达到了4
                                  是: 判断数组中表示的总的饮酒量是否为1
                                             是: 输出结果
                                  否: 调用自身,再次尝试下一步操作 
 [运行结果]
 * */


public class WineCaption {


    public static int[] wineLoop = new int[5];
    
    public static void printWineProc(int[] wineLoop){
        for(int i=wineLoop.length-1; i>=0; i--)
            {
            System.out.print(wineLoop[i]);
            if(i>0)
                System.out.print(',');    
            }
        System.out.println();
    }
    
    public static boolean calcTotalWine(int[] wineLoop){
        int totalFenZi = 0;
        int totalFenMu = 0;
        totalFenMu = wineLoop[1]*wineLoop[2]*wineLoop[3]*wineLoop[4];
        totalFenZi = totalFenMu / wineLoop[1] + totalFenMu / wineLoop[2] + totalFenMu / wineLoop[3] + totalFenMu / wineLoop[4];
        
        
        return totalFenMu == totalFenZi;
    }
    public static void drink(int[] wineLoop, int xb, int startNumber){
        for(int i=startNumber; i<=20; i++){
            wineLoop[xb] = i;
            if(xb==4)
            {
                if(calcTotalWine(wineLoop))
                    printWineProc(wineLoop);
            }
            else
                drink(wineLoop,xb+1,i+1);
            
        }
        
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        for(int i=0; i<5; i++)
            wineLoop[i]=0;
        
        drink(wineLoop,1,1);
    }
    


    
}
0 0