zoukankan      html  css  js  c++  java
  • 蓝桥杯  历届试题 剪格子  dfs

      历届试题 剪格子  

    时间限制: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

    题解:从左上角开始深度优先搜索,找出所有数加起来等于总和/2的最浅深度,即为最少格子数;

    #include<iostream>
    using namespace std;
    bool vis[11][11];
    int m,n,d[11][11],cnt=11111,sum=0;
    int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
    void dfs(int x,int y,int s,int v){
            if(s>sum||v>=cnt)//剪枝
                    return;
            if(s==sum){
                    cnt=cnt>v?v:cnt;//cnt取最小的v,即最小格子数;
                    return;
            }
            for(int i=0;i<4;i++){
                    int xx=x+dx[i];
                    int yy=y+dy[i];
                    if(xx>=0&&xx<n&&yy>=0&&yy<m&&!vis[xx][yy]){
                            vis[xx][yy]=1;
                            dfs(xx,yy,s+d[xx][yy],v+1);
                            vis[xx][yy]=0;
                    }
            }
    }
    int main()
    {
            scanf("%d%d",&m,&n);
            for(int i=0;i<n;i++)
                    for(int j=0;j<m;j++)
                            scanf("%d",&d[i][j]),sum+=d[i][j];
            if(sum%2)//不是2的倍数则无法分割
                    {printf("0
    ");return 0;}
            sum/=2;
            vis[0][0]=1;
            dfs(0,0,d[0][0],1);
            cnt==11111?printf("0
    "):printf("%d
    ",cnt);
            return 0;
    }
    
  • 相关阅读:
    python操作Excel模块openpyxl
    【转】用python读写excel的强大工具:openpyxl
    Python 保存数据的方法:
    【Python】使用POST方式抓取有道翻译结果
    python3以post方式提交数据
    python3.0与python2.0有哪些不同
    清理
    汇编学习(五)——表处理程序
    智能车学习(十五)——K60野火2013版例程
    通信原理实践(六)——基带传输
  • 原文地址:https://www.cnblogs.com/aeipyuan/p/10459911.html
Copyright © 2011-2022 走看看