import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 递增路径的最大长度
     * @param matrix int整型二维数组 描述矩阵的每个数
     * @return int整型
     */

    int max = 0;
    boolean[][] visited;

    public int solve (int[][] matrix) {
        // write code here
        visited = new boolean[matrix.length][matrix[0].length];
        for (int i = 0; i < matrix.length; i ++) {
            for (int j = 0; j < matrix[0].length; j++) {
                dfs(matrix, i, j, 0, Integer.MIN_VALUE);
            }
        }

        return max;
    }

    private void dfs (int[][] matrix, int x, int y, int dis, int pre) {

        if (x < 0 || x >= matrix.length || y < 0 || y >= matrix[0].length) { // 越界即停
            if (max < dis) { // 结算,直至走到上一个坐标,路径长度dis是否比max还要大
                max = dis;
            }
            return;
        }

        if (!visited[x][y] && pre < matrix[x][y]) { // 如果满足比上一个坐标点还要大,就证明该点是合法点,可以继续往下走
            visited[x][y] = true;
            dfs(matrix, x - 1, y, dis + 1, matrix[x][y]); //上
            dfs(matrix, x + 1, y, dis + 1, matrix[x][y]); //下
            dfs(matrix, x, y - 1, dis + 1, matrix[x][y]); //左
            dfs(matrix, x, y + 1, dis + 1, matrix[x][y]); //右
            visited[x][y] = false;
        } else { 
            // 如果不满足上述条件,证明自己走到了不该走(不合法)的地方,这时候马上结算,
            // 直至走到上一个坐标,路径长度dis是否比max还要大
            if (max < dis) {
                max = dis;
            }
        }
    }
}