• 历届试题 剪格子


    问题描述

    如下图所示,3 x 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
    样例输出1
    3
    样例输入2
    4 3
    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 }
  • 相关阅读:
    简单背包问题
    拓扑排序
    SPFA--P3905 道路重建
    Floyd--P1119 灾后重建
    Kmp--P3375 【模板】KMP字符串匹配
    练习 后缀数组
    BZOJ1036: [ZJOI2008]树的统计Count(树链剖分)
    BZOJ1503: [NOI2004]郁闷的出纳员(Splay)
    BZOJ2733: [HNOI2012]永无乡(线段树合并)
    BZOJ4196: [Noi2015]软件包管理器(树链剖分)
  • 原文地址:https://www.cnblogs.com/16crow/p/6657762.html
Copyright © 2020-2023  润新知