题目描述
我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60。
本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。
如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。
如果无法分割,则输出 0
程序输入输出格式要求:
程序先读入两个整数 m n 用空格分割 (m,n<10)
表示表格的宽度和高度
接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000
程序输出:在所有解中,包含左上角的分割区可能包含的最小的格子数目。
输入
10 1 52
20 30 1
1 2 3
输出
样例输入
4 3
1 1 1 1
1 30 80 2
1 1 1 100
样例输出
10
分析:简单dfs。。。,暴力搜索真的是能解决百分之80的简单求解问题。。。
import java.util.*;
public class Main {
static Scanner in = new Scanner(System.in);
static int m,n,sum,ans;
static int[][] a = new int[10][10];
static boolean[][] vis = new boolean[10][10];
static int[][] dir={{0,1},{1,0},{0,-1},{-1,0}};
static void dfs(int x,int y,int su,int cur){
vis[x][y] = true;
if (su*2 == sum ){
ans = Math.min(ans, cur);
}
for (int i = 0; i < 4; ++i){
int xx = dir[i][0] + x;
int yy = dir[i][1] + y;
if (xx < 0 || yy < 0 || xx >= n || yy >= m||vis[xx][yy]) continue;
vis[xx][yy] = true;
dfs(xx,yy,su + a[xx][yy], cur+1);
vis[xx][yy] = false;
}
}
public static void main(String[] args) {
m = in.nextInt();
n = in.nextInt();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
a[i][j]=in.nextInt();
vis[i][j]=false;
sum+=a[i][j];
}
}
ans = Integer.MAX_VALUE;
dfs(0,0,a[0][0],1);
if(ans==Integer.MAX_VALUE)
System.out.println(0);
else
System.out.println(ans);
}
}