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<cstdio>
    #include<cstring>
    using namespace std;
    int map[11][11],vis[11][11];
    int n,m,cnt;
    int flag=0;
    void dfs(int x,int y,int sum,int t)
    {
         
          if(sum==cnt/2&&flag==0)
         {
             printf("%d
    ",t);
             flag=1;
             return ;
         }
       if(sum>cnt/2)
                return ;
    
         if(y+1<n&&vis[x][y+1]==0)
            {
                vis[x][y+1]=1;
                  dfs(x,y+1,sum+map[x][y+1],t+1);
                vis[x][y+1]=0;
            }
    
         if(x+1<m&&vis[x+1][y]==0)
            {
                vis[x+1][y]=1;
               dfs(x+1,y,sum+map[x+1][y],t+1);
               vis[x+1][y]=0;
            }
      if(y-1>=0&&vis[x][y-1]==0)
            {
                vis[x][y-1]=1;
                dfs(x,y-1,sum+map[x][y-1],t+1);
                vis[x][y-1]=0;
            }
    
       if(x-1>=0&&vis[x-1][y]==0)
        {
            vis[x-1][y]=1;
            dfs(x-1,y,sum+map[x-1][y],t+1);
            vis[x-1][y]=0;
        }
    
    
     }
    int main()
    {
         int i,j;
         memset(vis,0,sizeof(vis));
         memset(map,0,sizeof(map));
        scanf("%d%d",&n,&m);
          cnt=0;
        for(i=0;i<m;i++)
          for(j=0;j<n;j++)
           {
                scanf("%d",&map[i][j]);
                cnt+=map[i][j];
           }
          if(cnt%2!=0)
            printf("0
    ");
         else
         {
             vis[0][0]=1;
             dfs(0,0,map[0][0],1);
         }
    
        return 0;
    }
  • 相关阅读:
    python 发邮件乱码
    膳魔师杯使用注意事项
    了解指针,分分钟的事情 C++筆記--指針
    海淘攻略
    【转】Cocos2dx.3x入门三部曲
    在Windows7上搭建Cocos2d-x 3.2alpha0开发环境
    黑苹果 MAC OS X 10.10.2 安装流程
    Linux 下如何查找木马并处理
    js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
    泰*网 Centos 一些命令
  • 原文地址:https://www.cnblogs.com/cancangood/p/4379274.html
Copyright © 2011-2022 走看看