1 # r表示行数,c表示列数 maxRoute最长距离的值
2 r, c, maxRoute = 0, 0, 0
3 areaMatrix, path = [], []
4
5
6 def LongestPath(i, j):
7 global maxRoute,path
8 leftMaxValue, rightMaxValue, upMaxValue, downMaxValue = 0, 0, 0, 0
9 # 如果该点的最大路径已经计算过,则直接返回,不需要再递归重复计算,提高效率
10 if path[i][j] > 0:
11 return path[i][j]
12 # 分别与四个方向的点比较,注意行、列不要越界,同时判断如果比当前位置值小,才进行递归
13 # 将当前点的四个方向符合条件的进行递归, 并记录返回的最大值
14 # 这里的符合条件不是四个方向中最小的一个,而是比该点位置低的点都可以
15 # 即对于四个方向的点存在比当前高度低的点都进行递归,选择一个数值最大加上1得到该点的最长路径
16 # 左边
17 if j - 1 >= 0 and areaMatrix[i][j] > areaMatrix[i][j-1]:
18 leftMaxValue = LongestPath(i, j-1)
19 # 右边
20 if j + 1 < r and areaMatrix[i][j] > areaMatrix[i][j+1]:
21 rightMaxValue = LongestPath(i, j+1)
22 # 上边
23 if i - 1 >= 0 and areaMatrix[i][j] > areaMatrix[i-1][j]:
24 upMaxValue = LongestPath(i-1, j)
25 # 下边
26 if i + 1 < c and areaMatrix[i][j] > areaMatrix[i+1][j]:
27 downMaxValue = LongestPath(i+1, j)
28 # 附近4个点的最大值加1,就得到该点的最大距离值
29 path[i][j] = max(leftMaxValue, rightMaxValue, upMaxValue, downMaxValue) + 1
30 if path[i][j] > maxRoute:
31 maxRoute = path[i][j]
32 # print(path)
33 # 返回这个i,j位置的最长路径值
34 return path[i][j]
35
36
37 def main():
38 global r, c, areaMatrix, path, maxRoute
39 r, c = map(int, input().split())
40 # 区域二维数组
41 areaMatrix = [[0] for i in range(r)]
42 # print(areaMatrix)
43 for i in range(r):
44 areaMatrix[i] = [int(n) for n in input().split()] # 输入矩阵
45 # print(areaMatrix)
46 """
47 5 5
48 1 2 3 4 5
49 16 17 18 19 6
50 15 24 25 20 7
51 14 23 22 21 8
52 13 12 11 10 9
53 """
54 # [[1, 2, 3, 4, 5], [16, 17, 18, 19, 6], [15, 24, 25, 20, 7], [14, 23, 22, 21, 8], [13, 12, 11, 10, 9]]
55 # 假设初始路径的值都是0
56 path = [[0 for i in range(c)] for j in range(r)] # 作为顶点的最长路径
57 # print(dis)
58
59 for i in range(r):
60 for j in range(c):
61 LongestPath(i, j)
62 print("滑雪最长距离为:%d" % maxRoute)
63
64
65 if __name__ == '__main__':
66 main()