有一只麻雀两棵树,每棵树每天长两片叶子

一个Java题目是这样的:

有一只麻雀两棵树,每棵树每天长两片叶子
麻雀前三天在孵化,不吃树叶
第4,5,6天每天吃一片树叶
第7,8,9,10天每天吃两片树叶
第11,12,13,14天每天吃三片树叶
之后每天吃五片树叶
麻雀吃不够树叶会饿死,树被吃光叶子也会死
要求写出让麻雀存活最久的程序

我写的程序仅仅让麻雀存活了47天,当然这不是最好的设计,我觉得麻雀应该可以活的更久。

这个题目思路还是很简单的:设想一种情景,假设麻雀要吃8片树叶,第一颗树有4片,第二棵树有5片,首先麻雀肯定不会饿死。为了让麻雀存活,有一颗树肯定要死。

麻雀的吃法:先再一棵树上吃一片树叶,再到另一颗树上吃一片,再回到第一颗树上吃一片,以此往复。

每次吃树叶时,看到这颗树上的叶子大于1,才去吃,否则不能吃。

第一颗树不能吃,看第二棵能否吃,如果第二棵树也不能吃(即它仅剩最后一片叶子),那么就吃掉第二棵树最后一片叶子。然后树死亡。

树类有一个变量isAlive标记树是否死亡,如果树还活着,它才能继续生长。

麻雀类:

public class Sparrow {
    public void eatStrategy(Tree tree1,Tree tree2,int num){
        System.out.println("麻雀总共要吃 "+num+" 片树叶");
        for(int i = 1;i<=num;i++){
            if (i%2==0){
                //吃第一颗树
                if(!this.eat(tree1)){
                    //树上的叶子不够了,吃另一颗树的
                    if(!this.eat(tree2)){
                        //第二棵树叶子也不够
                        //吃它最后一片叶子
                        tree2.leaves.remove(0);
                        System.out.println("麻雀吃掉了Tree2的最后一片叶子");
                    }
                }
            }else {
                if(!this.eat(tree2)){
                    //树上的叶子不够了,吃另一颗树的
                    if(!this.eat(tree1)){
                        //第二棵树叶子也不够
                        //吃它最后一片叶子
                        tree1.leaves.remove(0);
                        System.out.println("麻雀吃掉了Tree1的最后一片叶子");
                    }
                }
            }
        }
    }
    public boolean eat(Tree tree){
        //每次吃树叶时,看到这颗树上的叶子大于1,才去吃,否则不去吃。
        if (tree.leaves.size()>1){
            tree.leaves.remove(0);
            System.out.println("麻雀吃了 1 片树叶");
            return true;
        }else {
            return false;
        }
    }
    public void die(){
        System.out.println("麻雀吃不够树叶,饿死了");
    }
    //孵化
    public void hatch(){
        System.out.println("麻雀正在孵化中");
    }
}

树类:

public class Tree {
    private String name;
    public Tree(String name){
        this.name = name;
    }
    public ArrayList<Leaf> leaves = new ArrayList<>();
    public boolean isAlive = true;//是否活着
    //一天长两片叶子
    public void grow(){
        this.leaves.add(new Leaf());
        this.leaves.add(new Leaf());
    }
    public void die(){
        System.out.println("树叶吃完了,"+this.name+"死了");
        this.isAlive = false;
    }
    public String getName(){
        return name;
    }
}

叶子类是个示意性类:

public class Leaf {
}

测试函数:

public class TestMain {
    public static void main(String[] args) {
        Tree tree1 = new Tree("1号树");
        Tree tree2 = new Tree("2号树");
        Sparrow sparrow = new Sparrow();
        int num = 0;//吃树叶的数量
        for (int i = 1;; i++) {
            System.out.println("第" + i + "天:");
            if (tree1.isAlive)
                tree1.grow();
            if (tree2.isAlive)
                tree2.grow();
            if (i <= 3) {
                sparrow.hatch();
            } else {
                if (i > 3 && i < 7) {
                    num = 1;
                } else if (i >= 7 && i <= 10) {
                    num = 2;
                } else if (i >= 11 && i <= 14) {
                    num = 3;
                } else {
                    num = 5;
                }
                try {
                    sparrow.eatStrategy(tree1, tree2, num);
                } catch (IndexOutOfBoundsException e) {
                    sparrow.die();
                    break;
                }
            }
            System.out.println(tree1.getName()+"的叶子:" + tree1.leaves.size());
            System.out.println(tree2.getName()+"的叶子:" + tree2.leaves.size());
            if (tree1.leaves.size() == 0) {
                tree1.die();
            }
            if (tree2.leaves.size() == 0) {
                tree2.die();
            }
        }
    }
}

结果打印:

1天:
麻雀正在孵化中
1号树的叶子:2
2号树的叶子:22天:
麻雀正在孵化中
1号树的叶子:4
2号树的叶子:43天:
麻雀正在孵化中
1号树的叶子:6
2号树的叶子:64天:
麻雀总共要吃 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:8
2号树的叶子:75天:
麻雀总共要吃 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:10
2号树的叶子:86天:
麻雀总共要吃 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:12
2号树的叶子:97天:
麻雀总共要吃 2 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:13
2号树的叶子:108天:
麻雀总共要吃 2 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:14
2号树的叶子:119天:
麻雀总共要吃 2 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:15
2号树的叶子:1210天:
麻雀总共要吃 2 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:16
2号树的叶子:1311天:
麻雀总共要吃 3 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:17
2号树的叶子:1312天:
麻雀总共要吃 3 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:18
2号树的叶子:1313天:
麻雀总共要吃 3 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:19
2号树的叶子:1314天:
麻雀总共要吃 3 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:20
2号树的叶子:1315天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:20
2号树的叶子:1216天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:20
2号树的叶子:1117天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:20
2号树的叶子:1018天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:20
2号树的叶子:919天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:20
2号树的叶子:820天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:20
2号树的叶子:721天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:20
2号树的叶子:622天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:20
2号树的叶子:523天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:20
2号树的叶子:424天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:20
2号树的叶子:325天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:20
2号树的叶子:226天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:20
2号树的叶子:127天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:19
2号树的叶子:128天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:18
2号树的叶子:129天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:17
2号树的叶子:130天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:16
2号树的叶子:131天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:15
2号树的叶子:132天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:14
2号树的叶子:133天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:13
2号树的叶子:134天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:12
2号树的叶子:135天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:11
2号树的叶子:136天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:10
2号树的叶子:137天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:9
2号树的叶子:138天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:8
2号树的叶子:139天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:7
2号树的叶子:140天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:6
2号树的叶子:141天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:5
2号树的叶子:142天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:4
2号树的叶子:143天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:3
2号树的叶子:144天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:2
2号树的叶子:145天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
1号树的叶子:1
2号树的叶子:146天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃掉了Tree1的最后一片叶子
1号树的叶子:0
2号树的叶子:1
树叶吃完了,1号树死了
第47天:
麻雀总共要吃 5 片树叶
麻雀吃了 1 片树叶
麻雀吃了 1 片树叶
麻雀吃不够树叶,饿死了
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值