zoukankan      html  css  js  c++  java
  • 剪格子

    历届试题 剪格子  

    时间限制:1.0s   内存限制:256.0MB
          
    问题描述

    如下图所示,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
     
    //剪格子
    #include<iostream>
    #include<cstring>
    #define MAX 13
    using namespace std;
    int min(int a, int b){
        return a < b ? a : b;
    }
    int a[MAX][MAX], m, n;
    bool visit[MAX][MAX];
    int res, half;//最小个数,总数和的一半
    int dx[4] = { 0, 0, 1, -1 }, dy[4] = { 1, -1, 0, 0 };
    void dfs(int x, int y, int cnt, int sum){
        if (cnt > res)return;
        if (sum == half){ res = min(res, cnt); return; }
        for (int i = 0; i < 4; i++){
            int nx = x + dx[i], ny = y + dy[i];
            if (nx>=0 && nx<n&&ny>=0 && ny < m&&!visit[nx][ny]){
                visit[nx][ny] = true;
                dfs(nx, ny, cnt + 1, sum + a[nx][ny]);
                visit[nx][ny] = false;
            }
                
        }
        return;
    }
    int main()
    {
        while (cin >> m >> n){
            memset(visit, 0, sizeof(visit));
            res = INT_MAX;
            half = 0;
            for (int i = 0; i < n; i++){
                for (int j = 0; j < m; j++){
                    cin >> a[i][j];
                    half += a[i][j];
                }
            }
            if (half % 2 != 0){ cout << 0 << endl; continue; }//不能平分,直接判断
            half /= 2;
            visit[0][0] = true;
            dfs(0, 0, 1, a[0][0]);
            if (res == INT_MAX)cout << 0 << endl;
            else cout << res << endl;
        }
        return 0;
    }
    世上无难事,只要肯登攀。
  • 相关阅读:
    能帮你找到网页设计灵感的16个网站
    [转]自定义SqlMembershipProvider方法
    C#实现的根据年月日计算星期几的函数
    分享一个我自己写的支持多条件组合查询的分页存储过程
    史上最强的福克斯遥控钥匙失灵解决方案(zt)
    在页面实现数据还原,在终止数据库进程时,报不能用kill来终结自己的进程
    ViewState使用兼谈序列化
    jQuery 的上传图片预览插件
    Asp.net 备份、还原Ms SQLServer及压缩Access数据库
    aspnet_Membership表的意义
  • 原文地址:https://www.cnblogs.com/littlehoom/p/3565520.html
Copyright © 2011-2022 走看看