给定一个m * n的整数矩阵作为地图,短阵数值为地形高度; 中庸行者选择地图中的任意一点作为起点,尝试往上、下、左、右四个相邻格子移动; 移动时有如下约束: 中庸行者只能上坡或者下坡,不能走到高度相同的点 不允许连续上坡或者连续下坡,需要交替进行, 每个位置只能经过一次,不能重复行走, 请给出中庸行者在本地图内,能连续移动的最大次数。 输入 一个只包含整数的二维数组: 3 34 7 88 6 62 6 4 第一行两个数字,分别为行数和每行的列数; 后续数据为矩阵地图内容: 矩阵边长范围:[1, 8]; 地形高度范围:[0, 100000]; 输出 一个整数,代表中庸行者在本地图内,能连续移动的最大次数。 示例1 输入:2 21 24 3输出:3解释: 3 > 4 > 1 > 2 示例2 输入:3 31 2 43 5 76 8 9输出:4解释: 6 > 3 > 5 > 2 > 4 Java 题解 回溯 遍历每个位置做为起点进行回溯探索最大次数 import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int m = scanner.nextInt(), n = scanner.nextInt(); int[][] grid = new int[m][n]; for (int r = 0; r < m; r++) { for (int c = 0; c < n; c++) { grid[r][c] = scanner.nextInt(); } } Solution solution = new Solution(); System.out.println(solution.solve(grid)); }}class Solution { int max; public int solve(int[][] g) { this.max = 0; int m = g.length, n = g[0].length; boolean[][] vis = new boolean[m][n]; // 从每个位置作为起点尝试获取最大的移动步数 for (int r = 0; r < m; r++) { for (int c = 0; c < n; c++) { dfs(g, vis, r, c, 0, true); dfs(g, vis, r, c, 0, false); } } return this.max; } /** * * @param g 矩阵地图 * @param vis 访问状态 * @param r 当前所在位置行 * @param c 当前所在位置列 * @param times 已经移动的次数 * @param up 是否走上坡到达当前位置 */ private void dfs(int[][] g, boolean[][] vis, int r, int c, int times, boolean up) { this.max = Math.max(max, times); int M = g.length, N = g[0].length; vis[r][c] = true; int[] dirs = new int[]{-1, 0, 1, 0, -1}; for (int k = 1; k < 5;