倒油题目(Java源代码)

该博客探讨了一位厨师如何借助8斤和5斤油桶从12斤油桶中取出6斤油的数学问题。博主提供了Java代码解决方案,通过桶之间的倒油操作实现目标重量的提取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目如下:有一位厨师要从盛12斤油(a桶)的桶中倒出6斤油来,可是手边只有盛8斤油(b桶)和盛5斤油(c桶)的两个桶,问如何操作才能将6斤取出来呢?
代码如下:
文件1

public class DaoYou{
    public static void main(String args[]){
        DaoYou t = new DaoYou();
        t.t1();
    }
    //2:有一位厨师要从盛12斤油(a桶)的桶中倒出6斤油来,可是手边只有盛8
    //斤油(b桶)和盛5斤油(c桶)的两个桶,问如何操作才能将6斤取出来呢?
    private void t1(){
        Tong t1 = new Tong();
        t1.max = 10;
        t1.now = 10;

        Tong t2 = new Tong();
        t2.max = 7;
        t2.now = 0;

        Tong t3 = new Tong();
        t3.max = 3;
        t3.now = 0;

        Tong ts[] = new Tong[3];
        ts[0] = t1;
        ts[1] = t2;
        ts[2] = t3;

        MySet set = new MySet();
        set.add(ts);

        stepDaoYou(set);        


    }
    int end = 5;
    private void stepDaoYou(MySet setKeNeng){
        for(Object objs : setKeNeng.getAll()){
            Tong ts[] = (Tong[])objs;

            //1:判断是否已经已完成
            if(ts[0].now==end || ts[1].now==end || ts[2].now==end){
                System.out.println("倒油完成---"+ts[0].now+","+ts[1].now+","+ts[2].now);
                break;
            }
            //2:递归
            stepDaoYou(keNengDaoYou(ts));           
        }

    }

    MySet yiDao = new MySet();


    private MySet keNengDaoYou(Tong [] ts){
        MySet setKeNeng = new MySet();
        System.out.println("A=="+ts[0].now+",B=="+ts[1].now+",C=="+ts[2].now);
        for(int i=0;i<ts.length;i++){
            for(int j=0;j<ts.length;j++){
                //1:不能自己给自己倒
                if(i==j){
                    continue;
                }
                //2:算出能倒多少
                int canDaoYou = ts[i].canOut();
                if(ts[i].canOut() > ts[j].canIn()){
                    canDaoYou = ts[j].canIn();
                }
                //3:模拟倒
                ts[i].out(canDaoYou);
                ts[j].in(canDaoYou);
                //4:判断这个倒油的步骤是否已经出现过了
                if(yiDao.contains("A="+ts[0].now+",B="+ts[1].now+",C="+ts[2].now)){
                    //已经出现了,不能这么倒,否则就死循环了
                    //还回去
                    ts[i].in(canDaoYou);
                    ts[j].out(canDaoYou);
                    //
                    continue;
                }
                //5:说明可以这么倒油
                //5.1:先在已倒里面加入新的可能的倒油情况
                yiDao.add("A="+ts[0].now+",B="+ts[1].now+",C="+ts[2].now);      
                //5.2添加可能性
                Tong newTs[] = new Tong[3];
                Tong t1 = new Tong();
                t1.max = ts[0].max;
                t1.now = ts[0].now;

                Tong t2 = new Tong();
                t2.max = ts[1].max;
                t2.now = ts[1].now;

                Tong t3 = new Tong();
                t3.max = ts[2].max;
                t3.now = ts[2].now;

                newTs[0] = t1;
                newTs[1] = t2;
                newTs[2] = t3;

                System.out.println("keneng------------------>"+"A="+ts[0].now+",B="+ts[1].now+",C="+ts[2].now); 
                setKeNeng.add(newTs);

                //6:把油还回去
                ts[i].in(canDaoYou);
                ts[j].out(canDaoYou);
            }
        }       
        return setKeNeng;       
    }


}


class Tong{
    //最大值
    public int max = 0;
    //当前值
    public int now = 0;

    public void in(int a){
        now += a;
    }
    public void out(int a){
        now -=a;
    }

    public int canIn(){
        return (max - now);
    }
    public int canOut(){
        return now;
    }   
}

文件2:

public class MySet{
    //用来存放所有添加进来的对象,初始长度为0表示开始是空的
    private Object[] objs = new Object[0];

    public boolean contains(Object obj){
        for(Object tm : objs){
            if(tm.equals(obj)){
                return true;
            }
        }
        return false;
    }
    public boolean add(Object obj){
        //判断是否重复
        if(contains(obj)){      
            return false;
        }
        //1:创建一个新的数组,长度为原来数组长度加1
        Object [] tempObjs = new Object[objs.length + 1];
        //2:复制原来的数组对象到新的数组对象
        System.arraycopy(objs,0,tempObjs,0,objs.length);
        //3:把对象添加到新的数组的最后一个
        tempObjs[objs.length] = obj;
        //4:把新的数组赋值给原来的数组对象
        objs = tempObjs;

        return true;
    }

    public Object[] getAll(){
        return objs;
    }
    public int getLen(){
        return objs.length;
    }   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值