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>
    #include<algorithm>
    using namespace std;
    
    int m, n;//表格的宽度和高度
    int data[11][11];//格子中元素
    int visited[11][11];
    int sum;//表格中所有元素的和
    int s;
    int res;
    //int temp;
    int t;
    int moving[4][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } };//移动的四个方向
    
    int dfs(int x, int y,int temp)
    {
        if (temp == s)
            return 1;
        int r=0;
        for (int k = 0; k < 4; k++)
        {
            int i = x + moving[k][0];
            int j = y + moving[k][1];
    
            //边界检查
            if (i >= 0 && i < n&&j >= 0 && j < m)
            {
                if (visited[i][j] == 0 && temp + data[i][j] <= s)
                {
                    visited[i][j] = 1;
                    r = dfs(i, j,temp+data[i][j]);
                    if (r)
                        return r + 1;
                    visited[i][j] = 0;
                }
            }
        }
        return 0;
    }
    
    int main()
    {
        while (cin >> m >> n)
        {
            memset(data, 0,sizeof(data));
            memset(visited, 0,sizeof(visited));
            sum = 0;
            //input
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                {
                    cin >> data[i][j];
                    sum += data[i][j];
                }
            }
    
            if (sum % 2 == 0)
            {
                s = sum / 2;
                //temp = data[0][0];
                if (data[0][0] == s)
                    res = 1;
                else
                {
                    visited[0][0] = 1;
                    res=dfs(0, 0,data[0][0]);
                }
            }
            else//如果和为奇数,则不可能存在剪格子方法
            {
                res = 0;
            }
            cout << res << endl;
        
        }
    
        return 0;
    }
  • 相关阅读:
    MPMoviePlayerController导致statusBar消失,导致内存泄露leak
    OpenRisc-35-基于orpsoc,eCos的sd card controller的测试实验
    编程之美读书笔记---单链表反序---要求只遍历一次
    POJ 3892 RSA Factorization
    hdu1200(来来回回串起来)
    余世维《有效沟通》听课笔记
    Java--Eclipse关联Java源码
    Why Python?
    《超级时间整理术》晨读笔记
    《放弃的艺术》晨读笔记
  • 原文地址:https://www.cnblogs.com/Deng1185246160/p/3594934.html
Copyright © 2011-2022 走看看