兔子繁衍问题

今天做了阿里编程测验,有一道兔子繁衍问题。
题目要求:
1. 猎人把一对兔子婴儿(一公一母称为一对)放到一个荒岛上,两年之后,它们生下一对小兔,之后开始每年都会生下一对小兔。生下的小兔又会以同样的方式继续繁殖。
2. 兔子的寿命都是x(x>=3)年,并且生命的最后一年不繁殖。
3. 如果岛上的兔子多于10对,那么猎人会每年在兔子们完成繁殖或者仙逝之后,从岛上带走两对最老的兔子。
请问y年(y>=3)后荒岛上所有的兔子加起来多少岁?(注意, 在条件3执行完之后)

输入: 从命令行输入两行整数,第一行是x,第二行是y
输出: y年后荒岛上所有的兔子岁数的总和

分析:
建一个兔子类,兔子有两个属性,年龄和最大年龄。然后可以定义三个函数,获取兔子实际年龄的函数,兔子死亡函数,兔子出生函数。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

//兔子类
class Rabbit
{
public:
    int age;
    int maxAge;
};

//获取兔子实际年龄
void getage(vector<Rabbit> &rab)
{
    for(vector<Rabbit>::iterator it = rab.begin(); it!=rab.end();it++)
    {
        it->age++;
    }
}

//兔子死亡函数
void death(vector<Rabbit> &rab)
{
    for(vector<Rabbit>::iterator it = rab.begin(); it!=rab.end();)
    {
        //当兔子实际年龄超过最大年龄时,兔子死亡
        if(it->age>=it->maxAge)
        {
            it = rab.erase(it);
        }
        else
        {
            it++;
        }
    }
}

//兔子出生函数
void increase(vector<Rabbit> &rab,int life)
{
    vector<Rabbit> Temp;
    for(vector<Rabbit>::iterator it = rab.begin(); it!=rab.end();it++)
    {
        //当兔子达到2岁时,可以繁衍
        if(it->age>=2&&it->age<it->maxAge)
        {
            Rabbit temp = {0,life};
            Temp.push_back(temp);
        }
    }
    for(auto life:Temp)
    {
        rab.push_back(life);
    }
}

int main()
{
    int x,y;
    cin>>x>>y;

    Rabbit rabbit1 = {0,x};
    Rabbit rabbit2 = {0,x};

    vector<Rabbit> rab;
    rab.push_back(rabbit1);
    rab.push_back(rabbit2);

    for(int i=1;i<=y;i++)
    {
        getage(rab);
        death(rab);
        increase(rab,x);
        //当兔子超过神10对,带走最老的1对
        if(rab.size()>20)
        {
            rab.erase(rab.begin());
            rab.erase(rab.begin());
        }
    }

    int num=0;
    for(auto x : rab)
    {
        num += x.age;
    }

    cout << num<<endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/fan_xingwang/article/details/77195863
今日推荐