• 蓝桥杯  历届试题 剪格子  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;
    }
    
  • 相关阅读:
    VS2010-MFC(Ribbon界面开发:创建Ribbon样式的应用程序框架)
    VS2010-MFC(图形图像:GDI对象之画刷CBrush)
    VS2010-MFC(图形图像:GDI对象之画笔CPen)
    VS2010-MFC(图形图像:CDC类及其屏幕绘图函数)
    VS2010-MFC(字体和文本输出:文本输出)
    VS2010-MFC(字体和文本输出:CFont字体类)
    VS2010-MFC(MFC常用类:MFC异常处理)
    矩阵快速幂
    Codeforces 510C (拓扑排序)
    UVA10305 Ordering Tasks
  • 原文地址:https://www.cnblogs.com/aeipyuan/p/10459911.html
Copyright © 2020-2023  润新知