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

    DFS

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<queue>
     5 #include<algorithm>
     6 using namespace std;
     7 int map[15][15];
     8 bool vis[15][15];
     9 int sum,num,m,n;
    10 int dir[4][2]={{0,-1},{0,1},{-1,0},{1,0}};//上下左右
    11 bool in(int x,int y){
    12     if(x<0||x>=n|y<0||y>=m||vis[x][y])
    13         return false;
    14     return true;
    15 }
    16 void dfs(int x,int y,int s,int nu){
    17     if(s==sum){
    18         if(nu<num){
    19             num=nu;
    20 
    21             //cout<<nu<<"   "<<num<<endl;
    22 
    23             return;
    24         }
    25     }
    26 
    27     int i,j,k,xx,yy;
    28     for(i=0;i<4;i++){
    29         xx=x+dir[i][0];
    30         yy=y+dir[i][1];
    31         if(in(xx,yy)&&(s+map[xx][yy]<=sum)&&nu+1<num){
    32             //cout<<nu<<"   "<<xx<<"   "<<yy<<endl;
    33             vis[xx][yy]=true;
    34             dfs(xx,yy,s+map[xx][yy],nu+1);
    35             vis[xx][yy]=false;
    36         }
    37     }
    38     //cout<<map[0][3]<<endl;
    39 }
    40 int main(){
    41     //freopen("D:\input.txt","r",stdin);
    42 
    43     int i,j,k;
    44     while(scanf("%d%d",&m,&n)!=EOF){
    45     memset(vis,false,sizeof(vis));
    46     sum=0;
    47     for(i=0;i<n;i++){
    48         for(j=0;j<m;j++){
    49             scanf("%d",&map[i][j]);
    50             sum+=map[i][j];
    51         }
    52     }
    53 
    54     if(sum%2){
    55         cout<<0<<endl;
    56     }
    57     else{
    58         num=m*n;
    59         sum=sum/2;
    60         //cout<<sum<<endl;
    61         vis[0][0]=true;
    62         dfs(0,0,map[0][0],1);
    63         vis[0][0]=false;
    64         //cout<<num<<endl;
    65         if(num==m*n){
    66             num=0;
    67         }
    68         cout<<num<<endl;
    69     }
    70     }
    71     return 0;
    72 }
  • 相关阅读:
    [排错] VO对象和POJO对象的关系
    celery(异步处理)+redis
    django开发经验(每日生鲜)
    开发流程
    linux 使用问题
    磁盘的操作
    文件系统的简单操作
    LINUX磁盘与档案系统
    文件操作
    Linux文档修改
  • 原文地址:https://www.cnblogs.com/Deribs4/p/4401159.html
Copyright © 2011-2022 走看看