public static pathes getLongPath(int i, int j)
        {
            pathes p       = new pathes();
            pathes curPath = new pathes();

            if (j > 0 && map[i, j].height > map[i, j - 1].height)// search left direction
            {
                curPath = getLongPath(i, j - 1);
                if (curPath.pathLength[0] > p.pathLength[0]) // if the current path length is bigger
                {
                    p = curPath;
                }
            }
            if (j < (column - 1) && map[i, j].height > map[i, j + 1].height)// search right direction
            {
                curPath = getLongPath(i, j + 1);
                if (curPath.pathLength[0] > p.pathLength[0])
                {
                    p = curPath;
                }
            }
            // search from the left direction
            if (i > 0 && map[i, j].height > map[i - 1, j].height)// search Up direction
            {
                curPath = getLongPath(i - 1, j);
                if (curPath.pathLength[0] > p.pathLength[0])
                {
                    p = curPath;
                }
            }
            if (i < (row - 1) && map[i, j].height > map[i + 1, j].height)// search down direction
            {
                curPath = getLongPath(i + 1, j);
                if (curPath.pathLength[0] > p.pathLength[0])
                {
                    p = curPath;
                }
            }
            p.pathLength[0]++;// add 1 to the path length
            location l = new location();

            l.x      = i;
            l.y      = j;
            l.height = map[i, j].height;
            p.path.Push(l);
            return(p);
        }
        static void Main(string[] args)
        {
            string[] lines = File.ReadAllLines(@"d:\map.txt");
            column = Convert.ToInt32(lines[0].Split(' ')[0]);
            row    = Convert.ToInt32(lines[0].Split(' ')[1]);

            map = new location[column, row];
            for (int i = 1; i < lines.Length; i++)
            {
                string[] mapVerticalLocations = lines[i].Split(' ');
                for (int j = 0; j < mapVerticalLocations.Length; j++)
                {
                    if (mapVerticalLocations[j] != null)
                    {
                        try
                        {
                            map[i - 1, j]        = new location();
                            map[i - 1, j].height = Convert.ToInt32(mapVerticalLocations[j]);
                            map[i - 1, j].x      = i;
                            map[i - 1, j].y      = j;
                        }
                        catch
                        {
                            map[i - 1, j].height = -1;
                            map[i - 1, j].x      = i;
                            map[i - 1, j].y      = j;
                        }
                    }
                }
            }
            /*//////////////////////////////*/
            pathes longestPath = new pathes();

            for (int i = 0; i < row; i++)
            {
                for (int j = 0; j < column; j++)
                {
                    pathes temp = getLongPath(i, j);
                    if (longestPath.path.Count == temp.path.Count)
                    {
                        if (longestPath.path.Count > 0)
                        {
                            if ((temp.path.Peek().height - temp.path.ElementAt(temp.path.Count - 1).height) > (longestPath.path.Peek().height - longestPath.path.ElementAt(longestPath.path.Count - 1).height))
                            {
                                longestPath = temp;
                            }
                        }
                        else
                        {
                            longestPath = temp;
                        }
                    }
                    else if (longestPath.path.Count < temp.path.Count)
                    {
                        longestPath = temp;
                    }
                }
            }
            Console.WriteLine("Maximal Path is: " + longestPath.pathLength[0] + "\nMaximal Drop is: " + (longestPath.path.Peek().height - longestPath.path.ElementAt(longestPath.path.Count - 1).height).ToString());
            Console.WriteLine("The path is :\n");
            for (int i = 0; i < longestPath.path.Count; i++)
            {
                Console.WriteLine(longestPath.path.ElementAt(i).height.ToString() + "  >==>  ");
            }
            System.Console.ReadKey();
        }