剪格子
方法一
深搜 + 剪枝 + 回溯
import java.util.Scanner;
//1:无需package
//2: 类名必须Main, 不可修改
public class Main {
static int[][] g;
static int[][] v;
private static int total;
private static int m;
private static int n;
private static int ans = Integer.MAX_VALUE;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 在此输入您的代码...
m = scan.nextInt();
n = scan.nextInt();
scan.nextLine();
g = new int[n][m];
v = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
g[i][j] = scan.nextInt();
total+=g[i][j];
}
}
dfs(0, 0, 0, 0);
System.out.println(ans);
scan.close();
}
static void dfs(int i, int j, int steeps, int sum) {
// 非法路径直接返回
if (i < 0 || i == n || j < 0 || j == m || v[i][j] == 1) return;
if(sum == total /2) {
ans = Math.min(steeps, ans);
return;
}
if (sum > total / 2) {
return;
}
v[i][j] = 1;
dfs(i + 1, j, steeps + 1, sum + g[i][j]); // 上
dfs(i - 1, j, steeps + 1, sum + g[i][j]); // 下
dfs(i, j - 1, steeps + 1, sum + g[i][j]); // 左
dfs(i, j + 1, steeps + 1, sum + g[i][j]); // 右
// 回溯
v[i][j] = 0;
}
}