题目描述
小华按照地图去寻宝,地图上被划分成 m 行和 n 列的方格,横纵坐标范围分别是 [0, n-1] 和 [0, m-1]。
在横坐标和纵坐标的数位之和不大于 k 的方格中存在黄金(每个方格中仅存在一克黄金),但横坐标和纵坐标之和大于 k 的方格存在危险不可进入。小华从入口 (0,0) 进入,任何时候只能向左,右,上,下四个方向移动一格。
请问小华最多能获得多少克黄金?
输入描述
坐标取值范围如下:
0 ≤ m ≤ 50
0 ≤ n ≤ 50
k 的取值范围如下:
0 ≤ k ≤ 100
输入中包含3个字数,分别是m, n, k
输出描述
输出小华最多能获得多少克黄金
用例
输入 40 40 18
输出 1484
说明 无
输入 5 4 7
输出 20
说明 无
import java.util.Scanner;
public class Main {
static int k;
static int max = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
k = sc.nextInt();
int[][] arr = new int[m][n];
boolean[][] flag = new boolean[m][n];
// 赋值
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
// 数位不大于k
if (getMaxLenExp(i) + getMaxLenExp(j) <= k) {
arr[i][j] = 1;
}
flag[i][j] = false;
}
}
dfs(arr, 0, 0, flag);
System.out.println(max);
}
//
private static void dfs(int[][] arr, int x, int y, boolean[][] flag) {
if (x >= arr.length || y >= arr[0].length || x < 0 || y < 0 || flag[x][y]) {
return ;
}
flag[x][y] = true;
max+=arr[x][y];
// 向下走
if (x + 1 < arr.length) {
dfs(arr, x + 1, y, flag);
}
// 向上走
if (x - 1 >= 0) {
dfs(arr, x - 1, y, flag);
}
// 向右走
if (y + 1 < arr[0].length) {
dfs(arr, x, y + 1, flag);
}
// 向左走
if (y - 1 >= 0) {
dfs(arr, x, y - 1, flag);
}
}
public static int getMaxLenExp(int num) {
int sum = 0;
while (num > 0) {
sum += num % 10;
num /= 10;
}
return sum;
}
}