zoukankan      html  css  js  c++  java
  • 蓝桥杯:剪格子

    问题描述

    如下图所示,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,下面是两种实现
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int MAXN=15;
    const int INF=0x3fffffff;
    int card[MAXN][MAXN];
    int vis[MAXN][MAXN];
    int n,m;
    int sum;
    int dx[4]={1,0,-1,0};
    int dy[4]={0,1,0,-1};
    int res;
    int dfs(int y,int x,int s)
    {
        if(s>=sum/2)
        {
            if(s==sum/2)
                return 1;
            return INF;
        }
        int t=INF;
        for(int i=0;i<4;i++)
        {
            int ny=y+dy[i];
            int nx=x+dx[i];
            if(0<=ny&&ny<n&&0<=nx&&nx<m&&!vis[ny][nx])
            {
                vis[ny][nx]=1;
                t=min(dfs(ny,nx,s+card[ny][nx]),t);
                vis[ny][nx]=0;
            }
        }
        return t+1;
    }
    
    int main()
    {
        memset(vis,0,sizeof(vis));
        scanf("%d%d",&m,&n);
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                scanf("%d",&card[i][j]);
                sum+=card[i][j];
            }
        if(sum%2!=0)
        {
            printf("0
    ");
        }
        else
        {
            vis[0][0]=1;
            res=dfs(0,0,card[0][0]);
            printf("%d
    ",res);
        }
        
        return 0;
    }



    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int MAXN=15;
    const int INF=0x3fffffff;
    int card[MAXN][MAXN];
    int vis[MAXN][MAXN];
    int n,m;
    int sum;
    int dx[4]={1,0,-1,0};
    int dy[4]={0,1,0,-1};
    int res;
    void dfs(int y,int x,int s,int steps)
    {
        if(s>=sum/2)
        {
            if(s==sum/2)
                res=min(res,steps);
            return ;
        }
        
        for(int i=0;i<4;i++)
        {
            int ny=y+dy[i];
            int nx=x+dx[i];
            if(0<=ny&&ny<n&&0<=nx&&nx<m&&!vis[ny][nx])
            {
                vis[ny][nx]=1;
                dfs(ny,nx,s+card[ny][nx],steps+1);
                vis[ny][nx]=0;
            }
        }
    }
    int main()
    {
        memset(vis,0,sizeof(vis));
        scanf("%d%d",&m,&n);
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                scanf("%d",&card[i][j]);
                sum+=card[i][j];
            }
        if(sum%2!=0)
        {
            printf("0
    ");
        }
        else
        {
            res=INF;
            vis[0][0]=1;
            dfs(0,0,card[0][0],1);    
            printf("%d
    ",res);
        }
        
        return 0;
    }

     下面的实现可能不包含左上角的格子

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int MAXN=15;
    const int INF=0x3fffffff;
    int card[MAXN][MAXN];
    int vis[MAXN][MAXN];
    int n,m;
    int sum;
    int dx[4]={1,0,-1,0};
    int dy[4]={0,1,0,-1};
    int res;
    int dfs(int y,int x,int s)
    {
        if(s>=sum/2)
        {
            if(s==sum/2)
                return 0;
            return INF;
        }
        int t=INF;
        for(int i=0;i<4;i++)
        {
            int ny=y+dy[i];
            int nx=x+dx[i];
            if(0<=ny&&ny<n&&0<=nx&&nx<m&&!vis[ny][nx])
            {
                vis[y][x]=1;
                t=min(dfs(ny,nx,s+card[y][x]),t);
                vis[y][x]=0;
            }
        }
        return t+1;
    }
    
    int main()
    {
        memset(vis,0,sizeof(vis));
        scanf("%d%d",&m,&n);
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                scanf("%d",&card[i][j]);
                sum+=card[i][j];
            }
        if(sum%2!=0)
        {
            printf("0
    ");
        }
        else
        {
            res=dfs(0,0,0);
            printf("%d
    ",res);
        }
        
        return 0;
    }
  • 相关阅读:
    HDU2066一个人的旅行(dijkstra)
    HDU2544最短路(dijkstra)
    iOS 入门 界面UI 界面跳转
    Lua 函数作为参数传递时的注意事项
    成为Lua高手之metatable
    Android 之 声音捕捉
    Lua 多变长参数传递之三点(...)
    iOS之声音捕捉
    iOS ZXing 二维码模块的加入
    Windows 7 系统的系统界面语言切换成风骚的英文
  • 原文地址:https://www.cnblogs.com/program-ccc/p/5256364.html
Copyright © 2011-2022 走看看