您的位置:首页 > 其它

再谈奶牛问题

2009-12-09 15:38 246 查看
在博客园上看到很多人讨论的”在csdn上看到奶牛问题,写了下算法“和“奶牛问题”,觉得好玩,自己尝试着用面向对象的方法算了一下,练练手,没有技术含量,记录下来。
一、问题还原
一只刚出生的小牛,4年后生一只小牛,以后每年生一只。现有一只刚出生的小牛,问20年后共有牛多少只?

ps:看到很多人在原题处留言说这题出的不严谨云云。下面的所有实现都是在理想状态下,特此声明。
二、具体实现
1、奶牛实体类

代码

class Program
{
static List<Cow> listCows = new List<Cow>();
static int maxYear = 20;
public static void GetBirth(int year)
{
List<Cow> listBornCows = new List<Cow>();//用于添加新生的奶牛
Cow firstCow = new Cow(1, 1, 1, 0);
listCows.Add(firstCow);
for (int i = 0; i < year; i++)
{
foreach (Cow item in listCows)
{
item.Age++; //年龄自增
if (item.Age > 4)
{
//生出一头牛
Cow birth = new Cow(1, item.Generation + 1, listCows.Count + 1, item.Id);
listBornCows.Add(birth); //添加新生的奶牛
}
}
listCows.AddRange(listBornCows);
listBornCows.Clear();
}
}

public static List<Cow> GetCowByParentId(int parentId)
{
List<Cow> result = new List<Cow>();
foreach (Cow item in listCows)
{
if (item.ParentId == parentId)
{
result.Add(item);
}
}
return result;
}

public static void ShowCows()
{
int count = 0;
if (listCows != null)
{
count = listCows.Count;
}
Console.WriteLine(string.Format("After 20 years,cows count:{0}", count.ToString()));

/*下面按照所属母亲(ParentId)显示对应奶牛数*/
int maxParentId = 0;
if (listCows.Count > 0)
{
//按照所属母亲 逆序排序
listCows.Sort(delegate(Cow left, Cow right) { return right.ParentId.CompareTo(left.ParentId); });
maxParentId = listCows[0].ParentId;
}
for (int i = 0; i < maxParentId; i++)
{
List<Cow> listModels = GetCowByParentId(i);
Console.WriteLine(string.Format("Cow_{0}'s children as follows:", i));
if (listModels.Count == 0)
{
Console.WriteLine("Has no any child!");
}
else
{
foreach (Cow item in listModels)
{
Console.WriteLine(string.Format("Age:{0},Id:{1},Generation:{2}", item.Age, item.Id, item.Generation));
}
}
}
}

static void Main(string[] args)
{
GetBirth(maxYear);
ShowCows();
Console.ReadLine();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: