`
chenqiuzhen
  • 浏览: 7626 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

一对老鼠三年生育多少老鼠?

    博客分类:
  • java
 
阅读更多
package com.tryer;

import java.util.ArrayList;
import java.util.List;

/*假定老鼠是孕育周期是这样:
a、小老鼠出生后2个月性成熟,可以开始孕育
b、孕育周期是1个月,然后马上可以继续孕育
c、性衰退期是1年,也就是说一只老鼠最多只能生12窝
d、一窝老鼠10只,雌雄平均
e、生命周期是2年,

问,有一对刚出生的小老鼠,半年后有多少,一年后有多少,三年后有多少


		//1  2
		//2  2
		//3  2+10
		//4  2+10
		//5  2+10+10
		//6  2+10+10+50
		//7  2+10+10+50+10
*/

/**生命周期*/
enum Cycle {
	/** 新生老鼠 */
	newleft,
	/** 成熟老鼠 */
	mature,
	/** 孕育老鼠 */
	breed,
	/** 老年老鼠 */
	old,
	/** 死亡老鼠 */
	del

}
public class MonuseGame{
	// 老鼠集合
	public List<Mouse> mouseList = new ArrayList<>();
	private int delMonuse=0;//死亡老鼠数量

	public void exec(int month) {
		
		for (int i = 1; i <= month; i++) {
			//新生老鼠存放
			List<Mouse> newmouseList = new ArrayList<Mouse>();
			//死亡老鼠存放
			List<Mouse> templist= new ArrayList<Mouse>();
			
			for (Mouse mouse : mouseList) {
				mouse.setAgeMonth(mouse.getAgeMonth() + 1);
				if (mouse.getCycle() == Cycle.mature) {
					if (mouse.getAgeMonth() >= 3) {
						mouse.setCycle(Cycle.breed); //①
						mouse.setBreedMonth(mouse.getBreedMonth()+1);
					}
				}

				//①处如果执行,说明该老鼠是3个月及以上月份的老鼠,孕育完成了,可生产。so,此处用if 不用else if
				if (mouse.getCycle() == Cycle.breed) {
					if (mouse.getAgeMonth() >= 12) {
						mouse.setCycle(Cycle.old);
					} else {
						if (mouse.getSex() == 0 && mouse.getBreedMonth() >= MonuseFactory.breedCycle) {
							this.doMature(newmouseList);// 生老鼠
							mouse.setBreedMonth(0);
						} else if(mouse.getSex() == 0 && mouse.getBreedMonth() < MonuseFactory.breedCycle){
							mouse.setBreedMonth(mouse.getBreedMonth()+1);
						}
					}

				} else if (mouse.getCycle() == Cycle.newleft) {
					if (mouse.getAgeMonth() >= 2) {
						mouse.setCycle(Cycle.mature);
					}
				} else if (mouse.getCycle() == Cycle.old) {
					if (mouse.getAgeMonth() >= 24) {
						mouse.setCycle(Cycle.del);
					}
				}else if(mouse.getCycle()==Cycle.del){
					templist.add(mouse);
				}

			}
			/**
			 * 不移除死亡的老鼠,发现用6G内存启动都跑29个月老鼠的数量,5分钟没反应,然后内存溢出
			 */
			//升天了的老鼠,还是别占地儿了,记个数就行了~\(≧▽≦)/~
			for (Mouse mouse : templist) {
				mouseList.remove(mouse);
				mouse=null;
				delMonuse++;
			}
			templist = new ArrayList<Mouse>();// 释放内存
			
			
			
			System.out.println("已有老鼠数量:"+mouseList.size());
			System.out.println("新增老鼠数量:"+newmouseList.size());
			mouseList.addAll(newmouseList);
			newmouseList = null;// 释放内存
		}
	}

	// 生10只老鼠
	private void doMature(final List<Mouse> list) {
		for (int i = 0; i < 10; i++) {
			try {
				list.add(MonuseFactory.getMouse());// 生老鼠
			} catch (Exception e) {
				e.printStackTrace();
			}
		} 
	
	}

	public static void main(String[] args) {
		MonuseGame t = new MonuseGame();
		//初始两只新老鼠
		t.mouseList.add(MonuseFactory.getMouse());
		t.mouseList.add(MonuseFactory.getMouse());
		t.exec(6);// 28个月
		/**
		 * 28个月
			 总共老鼠:75236290
			小老鼠:54108750
			成熟老鼠:10287500
			可育老鼠:10809050
			老老鼠:30990
			母老鼠:37618145
			死亡老鼠:12
		 * 
		 * 
		 * 29个月
		 * 	总共老鼠:144800280
			小老鼠:105482750
			成熟老鼠:18190000
			可育老鼠:21061550
			老老鼠:65980
			母老鼠:72400151
		 */
		

		long count = t.mouseList.stream()
				.filter(u -> (u.getCycle() != Cycle.del)).count();
		long newcount = t.mouseList.stream()
				.filter(u -> (u.getCycle() == Cycle.newleft)).count();
		long maturecount = t.mouseList.stream()
				.filter(u -> (u.getCycle() == Cycle.mature)).count();
		long breedcount = t.mouseList.stream()
				.filter(u -> (u.getCycle() == Cycle.breed)).count();
		long oldcount = t.mouseList.stream()
				.filter(u -> (u.getCycle() == Cycle.old)).count();
		long moCount =  t.mouseList.stream()
				.filter(u ->u.getSex()==0).count();
		
/*********************java8以下版本   */
//		long count = 0L;
//		long newcount = 0L;
//		long maturecount = 0L;
//		long breedcount = 0L;
//		long oldcount = 0L;
//		long moCount = 0L;
//
//		for (Mouse u : t.mouseList) {
//			if (u.getCycle() != Cycle.del) {
//				count++;
//			}
//			if (u.getCycle() == Cycle.newleft) {
//				newcount++;
//			}
//			if (u.getCycle() == Cycle.mature) {
//				maturecount++;
//			}
//			if (u.getCycle() == Cycle.breed) {
//				breedcount++;
//			}
//			if (u.getCycle() == Cycle.old) {
//				oldcount++;
//			}
//			if (u.getSex() == 0) {
//				moCount++;
//			}
//		}

		System.out.println("总共老鼠:"+count);
		System.out.println("小老鼠:"+newcount);
		System.out.println("成熟老鼠:"+maturecount);
		System.out.println("可育老鼠:"+breedcount);
		System.out.println("老老鼠:"+oldcount);
		System.out.println("母老鼠:"+moCount);
		System.out.println("死亡老鼠:"+t.delMonuse);
	}
}


class MonuseFactory {
	private static int sumMonse = 0;// 总共老鼠数量
	public final static int breedCycle = 1;// 孕育周期

	public synchronized static Mouse getMouse() {
		Mouse m = new Mouse(sumMonse);
		sumMonse++;
		return m;
	}
}

class Mouse {
	private int ageMonth = 0;// 月龄
	private Cycle cycle = Cycle.newleft;// 所处生命周期
	private int sex;//性别 0:雌  1:雄
	private int breedMonth =0;//当前老鼠如果是孕育期的雌老鼠,小鼠的孕期

	//控制雌雄老鼠数量相同
	public Mouse(int i){
		if(i%2==0){
			this.sex=0;
		}else{
			this.sex=1;
		}
	}
	
	
	public int getBreedMonth() {
		return breedMonth;
	}


	public void setBreedMonth(int breedMonth) {
		this.breedMonth = breedMonth;
	}


	public int getSex() {
		return sex;
	}

	public int getAgeMonth() {
		return ageMonth;
	}

	public void setAgeMonth(int ageMonth) {
		this.ageMonth = ageMonth;
	}

	public Cycle getCycle() {
		return cycle;
	}

	public void setCycle(Cycle cycle) {
		this.cycle = cycle;
	}

}

 

启用6G内存运行:

内存溢出了:

 

 

调试发现已产生的数量并没有超过int的最大值,不是越界导致。 

 

最后3年老鼠的数量还是没有算出来。

 

近日,又看到这个,一时间来了兴致又重新思考了一番,最后还是解决了问题:

 

public class MonuseGame2 {
    //老鼠每個月生命週期对应的数量
    Long[] temp = new Long[]{
            2L, 0L,//成长期2个月,初始化第一个2只老鼠
            0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,//成熟孕育期
            0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L};//老年期
    LinkedList<Long> leftMonse = new LinkedList(Arrays.asList(temp));
    Long del = 0L;//死亡老鼠数量
    public void exec(int month) {
        for (int i = 1; i < month; i++) {
            //进行一轮生长:将老年期的最后一个月的老鼠数量加入死亡老鼠数量中,并移出老鼠生命周期
            del += leftMonse.getLast();
            leftMonse.removeLast();
            leftMonse.addFirst(0L);//在第一行插入,使老鼠“生长”一个月

             //孕育周期是一个月,所以隔月生老鼠
           // if(i%2==0){
                Long sumMatureMonuse = 0L;
                for (int j = 2; j < 14; j++) {//将生命周期在2个月以上14个月以下的老鼠总数算出
                    if((j-2)%2==1){//孕育周期是一个月,所以隔月生老鼠
                        sumMatureMonuse += leftMonse.get(j);
                    }
                }
                //新生的老鼠等于总数除以2得到母老鼠数量,每只母老鼠生10只
                leftMonse.set(0, sumMatureMonuse / 2 * 10);
//            }
        }
        long count = 0L;
        long newcount = 0L;
        long maturecount = 0L;
        long oldcount = 0L;

        for (int i = 0; i < leftMonse.size(); i++) {
            count += leftMonse.get(i);
            if (i < 2) {
                newcount += leftMonse.get(i);
            } else if (i >= 2 && i < 14) {
                maturecount += leftMonse.get(i);
            } else if (i > 14) {
                oldcount += leftMonse.get(i);
            }

        }
        System.out.println("总共老鼠:" + count);
        System.out.println("小老鼠:" + newcount);
        System.out.println("成熟可育老鼠:" + maturecount);
        System.out.println("老老鼠:" + oldcount);
        System.out.println("母老鼠:" + count / 2);
        System.out.println("死亡老鼠:" + del);
    }
    public static void main(String[] args) {
        MonuseGame2 mg = new MonuseGame2();
        mg.exec(36);
    }
}

 

 

 

 

 

 

  • 大小: 233.1 KB
  • 大小: 51.9 KB
  • 大小: 31.3 KB
  • 大小: 16.9 KB
分享到:
评论

相关推荐

    老鼠+数据集+夜间老鼠+明厨亮灶

    老鼠数据集.详细:https://blog.csdn.net/qq_34717531/article/details/124034914?spm=1001.2014.3001.5502 。该数据集分为二个部分,JPEGImages和Annotations.JPEGImages文件夹中有1050+张各种场景的老鼠图像,共有...

    1. 猫和老鼠都有名字和体重两种属性,猫有抓老鼠的方法,对应的老鼠则有逃跑的方法

    2. 猫抓住了老鼠或者老鼠逃跑了,对于这两种情况,我们用体重、技能和速度来区分,若猫的体重、技能和速度大于或等于老鼠的体重、技能和速度,则猫可实现抓住老鼠的方法,若猫的体重、技能和速度小于老鼠的体重和...

    基于MaskRCNN的老鼠检测_老鼠检测_changedetection_老鼠检测_MaskRCNN_maskrcnn_

    在本文中,我们将深入探讨基于Mask R-CNN的老鼠检测技术。Mask R-CNN是一种用于对象检测和实例分割的深度学习框架,它在图像识别领域取得了显著的成果,尤其是在生物医学图像分析、自然场景理解等领域。 标题“基于...

    zoumigong.rar_老鼠形象_老鼠走迷宫_老鼠迷宫游戏_迷宫图_迷宫老鼠游戏

    程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。游戏的任务是使用键盘上的方向键操纵老鼠在规定的时间内走到粮仓处。 要求: 1老鼠形象可辨认,可用键盘操纵老鼠上下左右移动; 2...

    大班语言乡下老鼠和城里老鼠PPT课件.pptx

    大班语言乡下老鼠和城里老鼠PPT课件.pptx

    老鼠走迷宫C++

    【标题】"老鼠走迷宫C++"是一个编程项目,主要目标是使用C++语言来模拟老鼠在迷宫中寻找出路的过程,并可视化显示老鼠走过的路径。这个项目可以帮助学习者深入理解C++编程语言,同时涉及到算法设计和数据结构的应用...

    老鼠检测数据集,包含VOC和YOLO数据格式

    标题中的“老鼠检测数据集,包含VOC和YOLO数据格式”指的是一个专门用于训练机器学习或深度学习模型,特别是目标检测模型的数据集。这个数据集聚焦于识别和定位图像中的老鼠,它提供了两种常见的数据格式:VOC...

    中班语言教案《小老鼠吃辣椒》含PPT课件.doc

    中班语言教案《小老鼠吃辣椒》含PPT课件.doc 本资源是一个中班语言教案,旨在通过教学活动帮助学生初步学会朗诵诗歌,乐意用动作、有表情地表演诗歌,并感受诗歌的诙谐趣味。该教案配套了一份PPT课件,地址为kj../...

    美食大战老鼠wpe代码大全

    ### 美食大战老鼠WPE代码大全解析 在探讨美食大战老鼠这款游戏的WPE代码大全之前,我们先来了解一下WPE(World Programming Editor)是什么以及它如何被应用于游戏修改中。 #### WPE简介 WPE是一种强大的内存编辑...

    经典老鼠问题斐波那切数列

    斐波那切数列背景下的老鼠生育问题。java编程软件设计实验课程。有一对小老鼠,出生一周后长成一对大老鼠,两周后出生第一对小老鼠,自己变成一对大老鼠,上周的小老鼠变成了大...试编制程序,计算N周后有多少对老鼠?

    MFC猫捉老鼠游戏

    《MFC实现猫捉老鼠游戏详解》 在计算机编程领域,MFC(Microsoft Foundation Classes)是微软提供的一套面向对象的C++库,用于构建Windows应用程序。本篇文章将深入探讨如何利用MFC来开发一款经典的“猫捉老鼠”...

    明厨亮灶-阳光厨房-老鼠检测数据集(白天+夜晚)3362张-含voc(xml)+yolo(txt)+json三种格式标签.7z

    该数据集是博主做”阳光厨房“实际项目时所用,包含白天和夜晚老鼠出没数据,数据标注精准,背景丰富,目标分布均匀,算法拟合较好,该数据集标签包含voc(xml)、yolo(txt)、json三种格式。类别[“老鼠”]。多种...

    C++语言的老鼠走迷宫

    在编程领域,老鼠走迷宫问题是一个经典的图论与数据结构问题,通常用来演示和学习如何使用栈(Stack)这一数据结构来解决实际问题。在这个问题中,我们假设有一只老鼠在一个迷宫中,需要找到从起点到终点的最短路径...

    模拟老鼠探寻迷宫 可以手动模拟

    程序开始运行时显示一个迷宫地图,迷宫中央有一个老鼠,迷宫的右下方有一个粮仓。游戏的任务是利用键盘上的方向键操纵老鼠在规定的时间内走到粮仓处。 要求: (1) 老鼠形象可辨认可用键盘操纵老鼠上下左右移动; (2...

    幼儿园中班语言说课稿 老鼠三兄弟参考.doc

    幼儿园中班语言说课稿 老鼠三兄弟参考.doc

    猫和老鼠主题的简单网页(HTML+CSS)

    例如,`&lt;h1&gt;`标签用于设置大标题,可能是“猫和老鼠的世界”,`&lt;img&gt;`标签引用`images`文件夹中的相关图片,如可爱的猫和老鼠的插图。此外,`&lt;a&gt;`标签可以创建链接,链接到更多关于猫和老鼠的资源或者相关动画片。 ...

    VOC老鼠检测和识别数据集

    VOC老鼠检测数据集,1000多张使用lableimg标注软件,标注好的高质量图片数据,图片格式为jpg,标签有两种,分别为VOC格式和yolo格式,分别保存在两个文件夹中,可以直接用于YOLO系列的老鼠识别; 1、1000多张标注好...

    美食大战老鼠代码大全

    ### 美食大战老鼠代码解析 #### 一、引言 《美食大战老鼠》是一款融合了策略与塔防元素的游戏,在游戏中玩家需要利用各种美食作为武器来抵御老鼠的入侵。游戏内存在大量的代码用于控制游戏逻辑、角色属性以及特殊...

    猫抓老鼠游戏(C++实现)

    猫抓老鼠游戏,下面是部分代码 #include using namespace std; const int length=22; //a[0]将不使用,故如果要测试21只老鼠,此处应填22 bool a[length]; //用来记录对应某只老鼠是否已经排列进去 int b[length]; ...

    基于VC++的猫捉老鼠游戏

    本程序是在一个房间里猫捉老鼠的游戏。通过键盘上的上、下、左、右方向键控制一只猫,十只老鼠在窗口中自由活动,可随时改变行走方向,遇窗口边界则改变方向。猫碰到老鼠后就吃掉它(该鼠不再显示)。若猫吃掉所有...

Global site tag (gtag.js) - Google Analytics