您的位置:首页 > 其它

奶牛问题

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

最开始想了一个方法,就是把所有的奶牛都放在一个链表里面,然后依次循环年数,每次循环对链表内的奶牛进行操作,如果在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;
}


这个时间永远都是不变的,不会随着年份的增加而增加,唯一的缺点就是不知道每个奶牛的母亲是谁,呵呵,第一种方法可以在奶牛里面加个属性可以记录的,这个就实现不了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: