老鼠吃大米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;
        }

        //如何遍历所有的路径从起始到结束。      

       
       
    } 

 

非递归算法还没有想出来