培训班作业---作业1:公羊母羊生小羊的问题

因为昨天做了挺久,本来不想发的,越想越气,保存一下吧,从19.25开始做的,做到了22.10分才做完,题本身不难,只是要细分,我一开始是用直接遍历全部来分群的,后来想想那样会更复杂,所以最后采取了先分好的策略,没优化,时间和空间复杂度都非常高。

题目
  • 有一对刚出生的羊,公羊的寿命为15年(生下来是1岁,到16岁那年就死亡了),母羊的寿命为20年。
    公羊从3岁开始可以交配,到12岁结束就不能够交配了,公羊在3岁到8岁之间交配的,母羊一胎可以生1只
    公羊2只母羊,9到12岁之间交配的,母羊一胎可以生一只公羊,一只母羊,母羊从5岁开始可以生育的,
    到15岁结束就不能够生育了,同时公羊母羊一年只能够各自交配一次,母羊一年只能够生一胎,问多少年后,
    羊群的数量可以达到一万只?
思考过程写在注释上了
  • 先建立一个羊类,面向过程的题被我写成面向对象了,一开始没意识到,后来才发现,但是懒得改了哈哈。
  • 1.先建立一个sheep类
public class Sheep {
	private int age;//羊的年龄
	private int gender;//羊的公母 1为公,0为母
	private boolean jiaopei;//是否能交配

	public Sheep() {
		super();
	}

	public Sheep(int age, int gender) {
		super();
		this.age = age;
		this.gender = gender;
		this.jiaopei = false;//生下来是不能交配的
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getGender() {
		return gender;
	}

	public void setGender(int gender) {
		this.gender = gender;
	}

	public boolean isJiaopei() {
		return jiaopei;
	}

	public void setJiaopei(boolean jiaopei) {
		this.jiaopei = jiaopei;
	}

	@Override
	public String toString() {
		return "Sheep [age=" + age + ", gender=" + gender + ", jiaopei=" + jiaopei + "]";
	}
}

2.解题

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

import com.lwm.bean.Sheep;

public class homework1 {
	public static void main(String[] args) {
		Sheep gong=new Sheep(1,1);//一岁公羊一只
		Sheep mu=new Sheep(1,0);//一岁母羊一只
		List<Sheep> g1_16 = new ArrayList<Sheep>();//公羊大圈---所有公羊都包含且1-16岁
		List<Sheep> m1_21 = new ArrayList<Sheep>();//母羊大圈---所有母羊都包含且1-21岁
		
		List<Sheep> g1_2 = new ArrayList<Sheep>();//小公羊小圈---1-2岁的公羊
		List<Sheep> m1_4 = new ArrayList<Sheep>();//小母羊小圈---1-4岁的母羊
		
		List<Sheep> g3_8 = new ArrayList<Sheep>();//成年公羊小圈一---3-8岁的公羊
		List<Sheep> g9_12 = new ArrayList<Sheep>();//成年公羊小圈二---9-12岁的公羊
		List<Sheep> m5_15 = new ArrayList<Sheep>();//成年母羊小圈---5-15岁的公羊
		
		List<Sheep> g13_16 = new ArrayList<Sheep>();//老公羊小圈---13-16岁的公羊
		List<Sheep> m16_21 = new ArrayList<Sheep>();//老母羊小圈---16-21岁的公羊
		
		g1_16.add(gong);//大圈添加一只公羊
		m1_21.add(mu);//添加一只母羊
		
		int year=1;//目前是第1年
		int sheepCount=2;//目前羊的数量
		Sheep thisSheep=null;
		Sheep thisMu=null;
		Sheep thisGong=null;
		//开始计算
		while(sheepCount<10000) {//这里用sheepCount和g1_16+m1_21的size是一样的,为了看起来好看
			
			/**
			 * 先分类,遍历大圈,加进小圈
			 */
			
			//遍历公羊大圈,分圈每只公羊
			for(int i=0;i<g1_16.size();i++) {
				thisSheep=g1_16.get(i);
				//System.out.println("g1_16圈里有"+g1_16.size()+"只羊");
				if (1<=thisSheep.getAge()&&thisSheep.getAge()<=2) {
					g1_2.add(thisSheep);
					//System.out.println("g1_2圈里有"+g1_2.size()+"只羊");
				}else if (3<=thisSheep.getAge()&&thisSheep.getAge()<=8) {
					thisSheep.setJiaopei(true);//让这只公羊今年可以交配
					g3_8.add(thisSheep);
					//System.out.println("g3_8圈里有"+g3_8.size()+"只羊");
				}else if (9<=thisSheep.getAge()&&thisSheep.getAge()<=12) {
					thisSheep.setJiaopei(true);//让这只公羊今年可以交配
					g9_12.add(thisSheep);
					//System.out.println("g9_12圈里有"+g9_12.size()+"只羊");
				}else if (13<=thisSheep.getAge()&&thisSheep.getAge()<=16) {
					g13_16.add(thisSheep);
					//System.out.println("g13_16圈里有"+g13_16.size()+"只羊");
				}
			}//for的底
			
			//遍历母羊大圈,分圈每只母羊
			for(int i=0;i<m1_21.size();i++) {
				thisSheep=m1_21.get(i);
				//System.out.println("m1_21圈里有"+m1_21.size()+"只羊");
				if (1<=thisSheep.getAge()&&thisSheep.getAge()<=4) {
					m1_4.add(thisSheep);
					//System.out.println("m1_4圈里有"+m1_4.size()+"只羊");
				}else if (5<=thisSheep.getAge()&&thisSheep.getAge()<=15) {
					thisSheep.setJiaopei(true);//让这只母羊今年可以交配
					m5_15.add(thisSheep);
					//System.out.println("m5_15圈里有"+m5_15.size()+"只羊");
				}else if (16<=thisSheep.getAge()&&thisSheep.getAge()<=21) {
					m16_21.add(thisSheep);
					//System.out.println("m16_21圈里有"+m16_21.size()+"只羊");
				}
			}//for的底
			
			/**
			 * 给每只能交配的公羊分对象
			 */
			
			//遍历成年公羊3-8岁的小圈,和能生育的母羊交配
			for (int i = 0; i < g3_8.size(); i++) {//这时每只公羊都是能交配的,无需做判断
				thisGong=g3_8.get(i);//拿到这只公羊
				for (int j = i; j < m5_15.size(); j++) {//找一只母羊给这只公羊,已优化,原来为for (int j = 0; j < m5_15.size(); j++)
					thisMu=m5_15.get(j);//拿到这只母羊
					//让它们生
					if (thisMu.isJiaopei()==true) {//一只能交配的母羊
						//母羊生了一只公羊
						g1_16.add(new Sheep(0,1));
						//母羊生了两只母羊
						m1_21.add(new Sheep(0,0));
						m1_21.add(new Sheep(0,0));
						
						sheepCount=sheepCount+3;//羊群加三只羊
						
						thisGong.setJiaopei(false);//让这只公羊今年不能再生了
						thisMu.setJiaopei(false);//让这只母羊今年不能再生了
						break;
					}
				}
			}//for的底
			
			//遍历成年公羊9-12岁的小圈,和能生育的母羊交配
			for (int i = 0; i < g9_12.size(); i++) {//这时每只公羊都是能交配的,无需做判断
				thisGong=g9_12.get(i);//拿到这只公羊
				for (int j = g3_8.size(); j < m5_15.size(); j++) {//找一只母羊给这只公羊,已优化,原来为for (int j = 0; j < m5_15.size(); j++)
					thisMu=m5_15.get(j);//拿到这只母羊
					//让它们生
					if (thisMu.isJiaopei()==true) {//一只能交配的母羊
						//母羊生了一只公羊
						g1_16.add(new Sheep(0,1));
						//母羊生了一只母羊
						m1_21.add(new Sheep(0,0));
						
						sheepCount=sheepCount+2;//羊群加两只羊
						
						thisGong.setJiaopei(false);//让这只公羊今年不能再生了
						thisMu.setJiaopei(false);//让这只母羊今年不能再生了
						break;
					}
				}
			}//for的底
			
			
			/**
			 * 遍历公母羊群,让他们岁数增长,让老羊死亡
			 */
			
			//遍历公羊大圈,给羊增加岁数与杀死羊,刚生的羊不管
			for(int i=0;i<g1_16.size();i++) {
				thisSheep=g1_16.get(i);
				if (0<=thisSheep.getAge()&&thisSheep.getAge()<=15) {//2-15岁的羊,年龄+1
					thisSheep.setAge(thisSheep.getAge()+1);
				}else if (thisSheep.getAge()==16) {//杀掉16岁的羊
					g1_16.remove(thisSheep);
					sheepCount=sheepCount-1;
				}
			}//for的底
			
			//遍历母羊大圈,给羊增加岁数与杀死羊,刚生的羊不管
			for(int i=0;i<m1_21.size();i++) {
				thisSheep=m1_21.get(i);
				if (0<=thisSheep.getAge()&&thisSheep.getAge()<=20) {//2-20岁的羊,年龄+1
					thisSheep.setAge(thisSheep.getAge()+1);
				}else if (thisSheep.getAge()==21) {//杀掉16岁的羊
					m1_21.remove(thisSheep);
					sheepCount=sheepCount-1;
				}
			}//for的底
			
			System.out.println("今年是第"+year+"年,总共有"+sheepCount+"只羊");
			year++;
		}//while的底
	}
}

3.测试
在这里插入图片描述

总结
  • 1.我做虽然做出来了,但是不代表对,仅供欣赏。。。。。。
  • 2.我就想保存一下,毕竟写的挺久的,我一般做题就20分钟一个,这还是第一次。。。。。。
  • 注:这是培训班第10天课写的作业,我有基础所以写起来不难,新手学10天能写出来???
发布了5 篇原创文章 · 获赞 2 · 访问量 78

猜你喜欢

转载自blog.csdn.net/weixin_44035425/article/details/104575469
今日推荐