奶牛问题

来源:互联网 发布:java替换所有特殊字符 编辑:程序博客网 时间:2024/04/29 17:15

今天在网上不小心看到一人说了下奶牛问题,觉得特别有意思,因此自己就试了试。原问题是这么描述的:一头奶牛从出生后的第四年开始生育一头小奶牛,以后每年生育一头,第八年后不再生育,第十年死亡。给你一头刚出生的小奶牛,十五年后共有多少头奶牛?

最开始想了一个方法,就是把所有的奶牛都放在一个链表里面,然后依次循环年数,每次循环对链表内的奶牛进行操作,如果在4到8之间,向链表中插入一个新奶牛,如果等于10 ,那么直接从链表中删除,否则不操作。这样就解决问题了:代码如下:

private static int count(int years)         {            List<bull> bulls = new List<bull>();            bulls.Add(new bull(1));            for (int i = 0; i < years; i++ )            {                List<bull> newBulls = new List<bull>();                List<bull> oldBulls = new List<bull>();                foreach(var b in bulls)                {                                        if (4 <= b.Age && b.Age < 9)                     {                        newBulls.Add(new bull(1));                        b.Age += 1;                    }                    else if (b.Age == 10)                    {                        oldBulls.Add(b);                    }                    else                     {                        b.Age += 1;                        continue;                    }                }                bulls.AddRange(newBulls);                foreach(var b in oldBulls)                {                    bulls.Remove(b);                }            }            return bulls.Count;        }
问题解决了,自己又想想有没有更简单的,因为这样做效率实在太低了,如果年份多了,链表里面的对象增多,那么所消耗的时间将成几何增长。后来又思索得到一方法,建立一个数组,表示当年的一岁到十岁的奶牛,因为一头奶牛只能活到10岁,所以这个数组就够了。操作方式是依次循环年数,每次循环中,首先要记录的是每年产生的新生奶牛,然后就是奶牛年龄增大(把数组从1依次移动到9)。代码如下:
private static int quickCount(int years)         {            int[] arr = new int[10];            arr[0] = 1;            for (int i = 0; i < years; i++ )            {                int newCount = 0;                for (int j = 3; j < 8; j++ )                {                    newCount += arr[j];                }                                for (int k = 9; k > 0; k-- )                {                    arr[k] = arr[k - 1];                }                arr[0] = newCount;                //foreach(var s in arr)                //{                //    Console.Write(s + ",");                //}                //Console.WriteLine();            }            int count = 0;            foreach(var c in arr)            {                count += c;            }            return count;        }

这个时间永远都是不变的,不会随着年份的增加而增加,唯一的缺点就是不知道每个奶牛的母亲是谁,呵呵,第一种方法可以在奶牛里面加个属性可以记录的,这个就实现不了。

原创粉丝点击