培训班作业---作业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天能写出来???
标签:Sheep,小羊,作业,公羊,母羊,gender,new,public 来源: https://blog.csdn.net/weixin_44035425/article/details/104575469