一、题目描述
二、代码
import java.util.Scanner;
public class Main {
static int m, n;
static int[][] map;
static int[][] book;
static int mid;
//顺时针顺序
static int[][] order = {
{0, 1},
{1, 0},
{0, -1},
{-1, 0}
};
static int res;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
m = in.nextInt();
n = in.nextInt();
map = new int[n][m];
book = new int[n][m];
res = Integer.MAX_VALUE;
//计算所有数的和
int count = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
map[i][j] = in.nextInt();
count += map[i][j];
}
}
in.close();
//计算各个部分的和
mid = count / 2;
book[0][0] = 1;
dfs(0, 0, map[0][0], 1);
if(res == Integer.MAX_VALUE)
System.out.println(0);
else
System.out.println(res);
}
private static void dfs(int x, int y, int num, int res_tmp) {
if(num > mid){
return;
}
if(num == mid){
res = Math.min(res, res_tmp);
return;
}
for(int i = 0; i < 4; i++){
int x_tmp = x + order[i][0];
int y_tmp = y + order[i][1];
if(x_tmp >= 0 && x_tmp < n && y_tmp < m && y_tmp >= 0 && book[x_tmp][y_tmp] == 0){
book[x_tmp][y_tmp] = 1;
res_tmp += 1;
dfs(x_tmp, y_tmp, num + map[x_tmp][y_tmp], res_tmp);
res_tmp--;
book[x_tmp][y_tmp] = 0;
}
}
}
}
三、思路记录
- 使用 dfs
- 注意 自加/减 的使用方法(传入值时,使用a++形式,传过的仍为a)
四、结果