老鼠吃大米C#解法(递归实现)
来源:互联网 发布:sim808的单片机at指令 编辑:程序博客网 时间:2024/06/02 15:53
public static class PigRiceTool
{
public static PigRiceData GetPigRiceData(int[,] origion)
{
PigRiceData pigRiceData = new PigRiceData();
int beginX = 0;
int beginY = 0;
//pigRiceData.Max = GetMax(0, 0, origion);
ValueNode maxNode = GetMaxValueNode(new PointIndex(0,0),new PointIndex(1,1), origion);
pigRiceData.Max = maxNode.Value;
pigRiceData.MaxPath = maxNode.Path;
return pigRiceData;
}
private static int GetMax(int i, int j,int[,] origion)
{
if(i>origion.GetUpperBound(0)||j>origion.GetUpperBound(1))
return 0;
return origion[i, j] + Math.Max(GetMax(i + 1, j, origion), GetMax(i, j + 1, origion));
}
private static int GetMin(int i, int j, int[,] origion)
{
if (i > origion.GetUpperBound(0) || j > origion.GetUpperBound(1))
return 0;
return origion[i, j] + Math.Min(GetMin(i + 1, j, origion), GetMin(i, j + 1, origion));
}
/// <summary>
/// 获得最大值,已经实现
/// </summary>
/// <param name="i"></param>
/// <param name="j"></param>
/// <param name="data"></param>
/// <returns></returns>
private static ValueNode GetMaxValueNode(int i, int j, int[,] data)
{
ValueNode sNode = new ValueNode();
if (i > data.GetUpperBound(0) || j > data.GetUpperBound(1))
{
sNode.Value = 0;
sNode.Path = "";
}
else
{
ValueNode leftNode = GetMaxValueNode(i + 1, j, data);
ValueNode rightNode = GetMaxValueNode(i, j + 1, data);
if (leftNode.Value >= rightNode.Value)
{
sNode.Value = data[i, j] + leftNode.Value;
sNode.Path = i + "," + j + "->" + leftNode.Path;
}
else
{
sNode.Value = data[i, j] + rightNode.Value;
sNode.Path = i + "," + j + "->" + rightNode.Path;
}
}
return sNode;
}
/// <summary>
/// 获得最大值
/// </summary>
/// <param name="beginIndex"></param>
/// <param name="endIndex"></param>
/// <param name="data"></param>
/// <returns></returns>
private static ValueNode GetMaxValueNode(PointIndex beginIndex, PointIndex endIndex, int[,] data)
{
ValueNode sNode = new ValueNode();
endIndex.X = Math.Min(endIndex.X, data.GetUpperBound(0));
endIndex.Y = Math.Min(endIndex.Y, data.GetUpperBound(1));
beginIndex.X = Math.Max(beginIndex.X, data.GetLowerBound(0));
beginIndex.Y = Math.Max(beginIndex.Y, data.GetLowerBound(1));
if (beginIndex.X > endIndex.X || beginIndex.Y > endIndex.Y)
{
sNode.Value = 0;
sNode.Path = "";
}
else
{
ValueNode leftNode = GetMaxValueNode(new PointIndex(beginIndex.X + 1, beginIndex.Y), endIndex, data);
ValueNode rightNode = GetMaxValueNode(new PointIndex(beginIndex.X, beginIndex.Y+1), endIndex, data);
if (leftNode.Value >= rightNode.Value)
{
sNode.Value = data[beginIndex.X, beginIndex.Y] + leftNode.Value;
sNode.Path = beginIndex.X + "," + beginIndex.Y + "->" + leftNode.Path;
}
else
{
sNode.Value = data[beginIndex.X, beginIndex.Y] + rightNode.Value;
sNode.Path = beginIndex.X + "," + beginIndex.Y + "->" + rightNode.Path;
}
}
return sNode;
}
//如何遍历所有的路径从起始到结束。
}
非递归算法还没有想出来
- 老鼠吃大米C#解法(递归实现)
- “老鼠爱大米”
- 老鼠爱大米
- 老鼠爱大米
- 老鼠爱大米
- C实现猫吃老鼠问题。。。。。
- 猫吃老鼠的STL实现
- 精彩flash《老鼠爱大米》
- Q版《老鼠爱大米》
- 歌詞:老鼠爱大米日文版
- 猫吃老鼠问题的链表实现
- 老鼠爱大米、黄牛爱蛤蟆
- 猫吃老鼠问题
- 猫吃老鼠
- 猫吃老鼠 2
- 猫吃老鼠问题
- 猫吃老鼠问题
- 猫吃老鼠算法
- C#文件搜索实例
- DOS时代的游戏:刺杀希特勒、DOOM
- 将自定义.NET控件嵌入IE浏览器
- C#文件监视程序
- C# 系统分析器(第一个C#程序)
- 老鼠吃大米C#解法(递归实现)
- 呼吁,请正确使用“易语言.飞扬”(EF)中英文名称
- .Net下与传统COM和ActiveX的交互(原理与实践)
- 郁闷了。。。
- 开启电脑
- 今天解决了的一个DEBUG运行正常RELEASE出错的问题!
- Java多线程及线程池
- 请空缓存
- 让firefox支持children