首页 > 其他分享 >【洛谷 8601】 [蓝桥杯 2013 省 A] 剪格子

【洛谷 8601】 [蓝桥杯 2013 省 A] 剪格子

时间:2023-10-25 14:48:59浏览次数:54  
标签:洛谷 格子 int 8601 样例 dfs 蓝桥 ## include

# [蓝桥杯 2013 省 A] 剪格子

## 题目描述

如图 $1$ 所示,$3\times 3$ 的格子中填写了一些整数。

![](https://cdn.luogu.com.cn/upload/image_hosting/hsfjsi38.png)

我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是 $60$。

本题的要求就是请你编程判定:对给定的 $m\times n$ 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。

如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。

如果无法分割,则输出 $0$。

## 输入格式

程序先读入两个整数 $m$,$n$ 用空格分割 $(m,n<10)$
表示表格的宽度和高度。

接下来是 $n$ 行,每行 $m$ 个正整数,用空格分开。每个整数不大于 $10000$。

## 输出格式

程序输出:在所有解中,包含左上角的分割区可能包含的最小的格子数目。

## 样例 #1

### 样例输入 #1

```
3 3
10 1 52
20 30 1
1 2 3
```

### 样例输出 #1

```
3
```

## 样例 #2

### 样例输入 #2

```
4 3
1 1 1 1
1 30 80 2
1 1 1 100
```

### 样例输出 #2

```
10
```

## 提示

第二个用例中:

![](https://cdn.luogu.com.cn/upload/image_hosting/3u5omt41.png)

时限 5 秒, 64M。蓝桥杯 2013 年第四届省赛

 

题解:注意dfs是错解:因为可能

3

1 1 1

8 1 1

1 1 1

就没有办法dfs解决,因为dfs本质上是解决“一笔画问题”,卡错

样例较小时可以解决,较大则不可以

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<bits/stdc++.h>
using namespace std;
int ans=1e9,X,Y,n,m,a[12][12],sum,f[12][12];
//int dx[6]={1,0,0,-1};
//int dy[6]={0,1,-1,0};
int b[4][2]={{1,0},{0,1},{0,-1},{-1,0}};
void dfs(int x,int y,int sm,int now){
    if(sm==sum/2){
        if(now<ans && f[1][1]==1) ans=now;
        return ;
    }
    if(sm>sum/2) return ;
    for(int i=0;i<4;i++){
        //X=x+dx[i]; Y=y+dy[i];
        X=x+b[i][0]; Y=y+b[i][1];
        if(X<1 || X>n || Y<1 || Y>m) continue;
        if(f[X][Y]==1) continue;
        
        f[X][Y]=1; 
        dfs(X,Y,sm+a[X][Y],now+1);
        if(ans) return;
        f[X][Y]=0;
        
    }
    return ;
}

int main(){
    freopen("8601.in","r",stdin);
    freopen("8601.out","w",stdout);
    scanf("%d %d",&m,&n);
    //n为行数(高度),m为列数 
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
            sum+=a[i][j];
        }
    if(sum%2!=0){
        printf("0\n");
        return 0;
    }    
    
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            memset(f,0,sizeof(f));
            f[i][j]=1; 
            dfs(i,j,a[i][j],1);
        }
    printf("%d\n",ans);
    return 0;
}

 

标签:洛谷,格子,int,8601,样例,dfs,蓝桥,##,include
From: https://www.cnblogs.com/wuhu-JJJ/p/17787156.html

相关文章

  • 【每天例题】蓝桥杯 c++ 卡片
    卡片题目小蓝有k种卡片,—个班有n位同学,小蓝给每位同学发了两张卡片,—位同学的两张卡片可能是同一种,也可能是不同种,两张卡片没有顺序。没有两位同学的卡片都是一样的。小蓝有k种卡片,-个班有n位同学,小蓝给每位同学发了两张卡片,-位同学的两张卡片可能是同一种,也可能是不同种,......
  • 【每日例题】蓝桥杯 c++ 奇数倍数
    奇数倍数题目本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。请你找到最小的整数X同时满足:1.X是2019的整倍数;2.X的每—位数字都是奇数。运行限制·最大运行时间:1s·最大运行内存:128M蓝桥杯奇数倍数题目分析针对这个题目,要判断两个条件:1.这个数......
  • 洛谷P5706 【深基2.例8】再分肥宅水(Python3)
    关键点:1.同一行输入两个数input().split(),然后list一下存到变量里,这个不多说2。输出两个数Python中默认end=‘\n’,所以不用多写一遍换行。3.输出三位小数这里用到了Python的格式化输出,与c++的格式化输出非常相近,只是符号不同。具体可看这篇blog 代码如下:a=list(input(......
  • 洛谷 最长最短单词 c语言 函数解决
    #include<stdio.h>#include<string.h>inti;intmain(){intIs_letters(chara);//声明判断字母intbigword(charstr[]);//声明最长单词intminword(charstr[]);//声明最短单词charstr[20010];//str要足够大intt;gets(str);t......
  • 洛谷5597复读
    具体题解可以看zhy136036那一篇解释一下是如何合并树的每次都可以提取出来一个子树然后把这三棵子树重叠在一起(根对根,2号点对2号点,以此类推),就得到了这个新图然后解释一下为什么这么做是对的首先在单次操作中,至少需要把这个新树给遍历完,不然的话就会存在有些点遍历不到,即这是......
  • 洛谷-P9779 题解
    正文对于每个选择题,都有两种状态,因此总状态数为\(2^n\)。请注意初始所有选择题都不选也是一个状态,不计入贡献,因此答案为\(2^n-1\)。代码:#include<iostream>usingnamespacestd;intmain(){longlongn;cin>>n;cout<<(1<<n)-1;}提交记录。......
  • 洛谷题解 | AT_abc321_c Primes on Interval
    目录题目翻译题目描述输入格式输出格式样例#1样例输入#1样例输出#1样例#2样例输入#2样例输出#2样例#3样例输入#3样例输出#3题目简化题目思路AC代码题目翻译【题目描述】你决定用素数定理来做一个调查.众所周知,素数又被称为质数,其含义就是除了数字一和本身之外不能......
  • 洛谷 P2568 GCD
    题意:给定\(n\)求\(\displaystyle{\sum_{i=1}^n{\sum_{j=1}^n{\left[(i,j)\inprime\right]}}}\)其中\(prime\)为素数集合。\(n<10^7\)解:原式等于\[\displaystyle{\sum_{p\inprime}\sum_{i=1}^n{\sum_{j=1}^n{\left[(i,j)=p\right]}}}\]这等于\[\displa......
  • KMP模板(洛谷P3375)
    1#include<bits/stdc++.h>2usingnamespacestd;3strings1,s2;4vector<int>find_next(vector<int>next,strings)5{6inti=1,prefix=0,len=s.length();7while(i<len)8{9if(s[prefix]=......
  • 【洛谷 9240】[蓝桥杯 2023 省 B] 冶炼金属
    #[蓝桥杯2023省B]冶炼金属##题目描述小蓝有一个神奇的炉子用于将普通金属O冶炼成为一种特殊金属X。这个炉子有一个称作转换率的属性$V$,$V$是一个正整数,这意味着消耗$V$个普通金属O恰好可以冶炼出一个特殊金属X,当普通金属O的数目不足$V$时,无法继续冶炼。现......