2021/3/23算法题打卡- 剪格子
# 剪格子
## 题目
> 标题:剪格子
>
> 如图p1.jpg所示,3 x 3 的格子中填写了一些整数。
>
> 我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60。
>
> 本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。
> 如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。
> 如果无法分割,则输出 0
>
> 程序输入输出格式要求:
> 程序先读入两个整数 m n 用空格分割 (m,n<10)
> 表示表格的宽度和高度
> 接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000
> 程序输出:在所有解中,包含左上角的分割区可能包含的最小的格子数目。
>
>
> 例如:
> 用户输入:
> 3 3
> 10 1 52
> 20 30 1
> 1 2 3
>
> 则程序输出:
> 3
>
> 再例如:
> 用户输入:
> 4 3
> 1 1 1 1
> 1 30 80 2
> 1 1 1 100
>
> 则程序输出:
> 10
## 分析
本题是将格子剪为两部分,所以左上角必定在其中一份中,==因为是两份,所以我们可以直接得到每一份都是总数的二分之一==,然后我们可以直接通过dfs从四个方向尝试剪,并将全局变量count+1,,当所剪格子之和为二分之一后,则将count装入list中,最后输出最小的count
## 代码
```java
package com.blueBrageCup.B2013.A;
import javax.security.sasl.SaslClient;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* @auther thk
* @date 2021/3/5 - 10:30
*/
public class T9剪格子 {
static int m;
static int n;
static int half;
static List<Integer> countAll = new ArrayList<>();
static int count;
static int[][] a;
static int[][] b;
static void dfs(int row,int col,int sum){
if(row<0 || row>=n || col<0 || col >=m || b[row][col]==1){
return;
}
sum+=a[row][col];
count++;
b[row][col]=1;
if(sum==half){
countAll.add(count);
return;
}
if(sum>half) {
count--;
b[row][col]=0;
return;
}
dfs(row+1,col,sum);
dfs(row,col+1,sum);
dfs(row-1,col,sum);
dfs(row,col-1,sum);
b[row][col]=0;
count--;
return;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
m = scanner.nextInt();
n = scanner.nextInt();
a = new int[n][m];
b = new int[n][m];
int sum=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
int num = scanner.nextInt();
a[i][j]=num;
b[i][j]=0;
sum+=num;
}
}
half = sum/2;
dfs(0,0,0);
int min=m*n;
for(int i : countAll){
min=Math.min(i,min);
}
System.out.println(min==m*n?0:min);
}
}
```

浙公网安备 33010602011771号