历届试题 剪格子
问题描述
如下图所示,3 x 3 的格子中填写了一些整数。
+--*--+--+
|10* 1|52|
+--****--+
|20|30* 1|
*******--+
| 1| 2| 3|
+--+--+--+
|10* 1|52|
+--****--+
|20|30* 1|
*******--+
| 1| 2| 3|
+--+--+--+
我们沿着图中的星号线剪开,得到两个部分,每个部分的数字和都是60。
本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。
如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。
如果无法分割,则输出 0。
输入格式
程序先读入两个整数 m n 用空格分割 (m,n<10)。
表示表格的宽度和高度。
接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000。
输出格式
输出一个整数,表示在所有解中,包含左上角的分割区可能包含的最小的格子数目。
样例输入1
3 3
10 1 52
20 30 1
1 2 3
10 1 52
20 30 1
1 2 3
样例输出1
3
样例输入2
4 3
1 1 1 1
1 30 80 2
1 1 1 100
1 1 1 1
1 30 80 2
1 1 1 100
样例输出2
10
这个题就是一个dfs 我一开始想错了 从每个点开始向右或者向下走
其实就是遍历上下左右就可以了
1 import java.util.Scanner; 2 3 public class A { 4 static int[][] map; 5 static int sum = 0; 6 static int n, m; 7 static int out = 987654321; 8 static int stepNum = 987654321; 9 static int[][] vis; 10 11 public static void main(String[] args) { 12 Scanner sc = new Scanner(System.in); 13 m = sc.nextInt(); 14 n = sc.nextInt(); 15 map = new int[n][m]; 16 vis = new int[n][m]; 17 for (int i = 0; i < n; i++) { 18 for (int j = 0; j < m; j++) { 19 map[i][j] = sc.nextInt(); 20 sum += map[i][j]; 21 } 22 } 23 sum /= 2; 24 dfs(0, 0, 0, 1); 25 System.out.println(stepNum); 26 } 27 28 public static void dfs(int row, int col, int res, int step) { 29 if (row >= n || col >= m || row < 0 || col < 0) { 30 return; 31 } 32 if (vis[row][col] == 1) { 33 return; 34 } 35 if (res > sum) { 36 return; 37 } 38 vis[row][col] = 1; 39 res += map[row][col]; 40 if (res == sum) { 41 int num = step; 42 int flag = 0; 43 stepNum = stepNum < num ? stepNum : num; 44 } 45 dfs(row + 1, col, res, step + 1); 46 dfs(row - 1, col, res, step + 1); 47 dfs(row, col - 1, res, step + 1); 48 dfs(row, col + 1, res, step + 1); 49 vis[row][col] = 0; 50 } 51 52 }