static void Main(string[] args)
        {
            Cell startingPosition = new Cell(Console.ReadLine().Split(' ').Select(int.Parse).ToArray());
            Cell mazeSize = new Cell(Console.ReadLine().Split(' ').Select(int.Parse).ToArray());
            matrix = new int[mazeSize.row, mazeSize.col];
            visited = new bool[mazeSize.row, mazeSize.col];
            for (int i = 0; i < mazeSize.row; i++)
            {
                string[] rowInput = Console.ReadLine().Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
                for (int j = 0; j < rowInput.Length; j++)
                {
                    if (!rowInput[j].Contains('#'))
                    {
                        matrix[i, j] = int.Parse(rowInput[j]);
                    }
                    else
                    {
                        visited[i, j] = true;
                        //                        matrix[i, j] = -1;
                    }
                }
            }

            Recursion(startingPosition, 0);
            Console.WriteLine(maxSum);
        }
        static void Recursion(Cell currentCell, int sumSoFar)
        {
            if (!InCell(currentCell))
            {
                return;
            }

            if (visited[currentCell.row, currentCell.col])
            {
                sumSoFar += GetCellValue(currentCell);
            //                Console.WriteLine("->" + sumSoFar);

                if (sumSoFar > maxSum)
                {
                    maxSum = sumSoFar;
                }
                return;
            }

            if (InCell(new Cell(currentCell.row + GetCellValue(currentCell), currentCell.col)) ||
                InCell(new Cell(currentCell.row - GetCellValue(currentCell), currentCell.col)) ||
                InCell(new Cell(currentCell.row, currentCell.col + GetCellValue(currentCell))) ||
                InCell(new Cell(currentCell.row, currentCell.col - GetCellValue(currentCell))))
            {
                sumSoFar += GetCellValue(currentCell);
                visited[currentCell.row, currentCell.col] = true;
                Recursion(new Cell(currentCell.row + GetCellValue(currentCell), currentCell.col), sumSoFar);
                Recursion(new Cell(currentCell.row - GetCellValue(currentCell), currentCell.col), sumSoFar);
                Recursion(new Cell(currentCell.row, currentCell.col + GetCellValue(currentCell)), sumSoFar);
                Recursion(new Cell(currentCell.row, currentCell.col - GetCellValue(currentCell)), sumSoFar);
            }
        }
        static void Recursion(Cell currentCell, int sumSoFar)
        {
            if (!InCell(currentCell) || visited[currentCell.row, currentCell.col])
            {
                if (sumSoFar > maxSum)
                {
                    maxSum = sumSoFar;
                }
                return;
            }

            sumSoFar += GetCellValue(currentCell);
            visited[currentCell.row, currentCell.col] = true;
            Recursion(new Cell(currentCell.row + GetCellValue(currentCell), currentCell.col), sumSoFar);
            Recursion(new Cell(currentCell.row - GetCellValue(currentCell), currentCell.col), sumSoFar);
            Recursion(new Cell(currentCell.row, currentCell.col + GetCellValue(currentCell)), sumSoFar);
            Recursion(new Cell(currentCell.row, currentCell.col - GetCellValue(currentCell)), sumSoFar);
            sumSoFar -= GetCellValue(currentCell);
            visited[currentCell.row, currentCell.col] = false;
        }
 static bool InCell(Cell cell)
 {
     return cell.row > -1 && cell.row < matrix.GetLength(0) &&
         cell.col > -1 && cell.col < matrix.GetLength(1);
 }
 static int GetCellValue(Cell cell)
 {
     return matrix[cell.row, cell.col];
 }