[蓝桥杯]剪格子

article/2025/7/20 10:02:35

剪格子

题目描述

如下图所示,3 x 3 的格子中填写了一些整数。

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

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

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

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

输入描述

输入描述

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

接下来是 nn 行,每行 mm 个正整数,用空格分开。每个整数不大于 104104。

输出描述

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

输入输出样例

示例

输入

3 3
10 1 52
20 30 1
1 2 3

输出

3

运行限制

  • 最大运行时间:5s
  • 最大运行内存: 64M

总通过次数: 2669  |  总提交次数: 3114  |  通过率: 85.7%

难度: 中等   标签: 2013, 省赛, 搜索

方法思路

题目要求将网格分割成两个连通区域,使得两个区域的数字和相等,并输出包含左上角格子的最小格子数目。解决思路如下:

  1. 检查总和:计算网格所有元素的总和。如果总和为奇数,则无法分割,输出0。

  2. 深度优先搜索:从左上角格子开始DFS,探索所有四连通区域:

    • 剪枝优化:若当前区域和超过总和一半或格子数已超过最小解,则回溯。

    • 解验证:当区域和等于总和一半时,检查剩余部分是否连通(使用BFS)。

  3. 连通性检查:对剩余部分进行BFS,验证其连通性。

  4. 结果输出:记录满足条件的最小格子数,若未找到解则输出0。

    #include <iostream>
    #include <vector>
    #include <queue>
    #include <climits>
    using namespace std;int m, n;
    vector<vector<int>> grid;
    vector<vector<bool>> visited;
    int total = 0;
    int min_count = INT_MAX;// 方向数组:上、右、下、左
    int dx[4] = {-1, 0, 1, 0};
    int dy[4] = {0, 1, 0, -1};// 检查剩余部分连通性
    bool check_connectivity(int count) {int total_count = n * m;int remain_count = total_count - count;if (remain_count == 0) return true;// 找到第一个剩余格子int start_i = -1, start_j = -1;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (!visited[i][j]) {start_i = i;start_j = j;break;}}if (start_i != -1) break;}// BFS遍历剩余格子vector<vector<bool>> temp_vis(n, vector<bool>(m, false));queue<pair<int, int>> q;q.push({start_i, start_j});temp_vis[start_i][start_j] = true;int cnt = 1;while (!q.empty()) {auto [x, y] = q.front();q.pop();for (int k = 0; k < 4; k++) {int nx = x + dx[k];int ny = y + dy[k];if (nx >= 0 && nx < n && ny >= 0 && ny < m && !visited[nx][ny] && !temp_vis[nx][ny]) {temp_vis[nx][ny] = true;cnt++;q.push({nx, ny});}}}return cnt == remain_count;
    }// 深度优先搜索
    void dfs(int i, int j, int sum, int count) {// 剪枝:超过总和一半或已找到更优解if (sum > total / 2) return;if (count >= min_count) return;// 找到可行解并检查剩余部分连通性if (sum == total / 2) {if (check_connectivity(count)) {min_count = min(min_count, count);}return;}// 四方向扩展for (int k = 0; k < 4; k++) {int ni = i + dx[k];int nj = j + dy[k];if (ni >= 0 && ni < n && nj >= 0 && nj < m && !visited[ni][nj]) {visited[ni][nj] = true;dfs(ni, nj, sum + grid[ni][nj], count + 1);visited[ni][nj] = false;}}
    }int main() {cin >> m >> n;grid.resize(n, vector<int>(m));visited.resize(n, vector<bool>(m, false));// 读入网格并计算总和for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cin >> grid[i][j];total += grid[i][j];}}// 总和为奇数则无解if (total % 2 != 0) {cout << 0 << endl;return 0;}// 从左上角开始DFSvisited[0][0] = true;dfs(0, 0, grid[0][0], 1);// 输出结果if (min_count == INT_MAX) {cout << 0 << endl;} else {cout << min_count << endl;}return 0;
    }

    代码解释

  5. 输入处理

    • 读取网格的行数 n 和列数 m

    • 使用二维向量 grid 存储网格元素,visited 标记访问状态。

    • 计算网格元素总和 total

  6. 总和检查

    • 若总和为奇数,直接输出 0 并结束(无法分割)。

  7. 深度优先搜索

    • 从左上角 (0,0) 开始DFS,标记该格子已访问。

    • 剪枝:当前区域和超过 total/2 或格子数超过最小解时回溯。

    • 解验证:当区域和等于 total/2 时,调用 check_connectivity 检查剩余部分连通性。

  8. 连通性检查

    • 使用BFS遍历剩余格子:

      • 统计剩余格子数量 remain_count

      • 从第一个剩余格子开始BFS,统计连通格子数 cnt

      • 若 cnt == remain_count 则剩余部分连通。

  9. 结果输出

    • 若找到解,输出最小格子数 min_count

    • 若未找到解,输出 0

示例说明

对于输入样例:

3 3
10 1 52
20 30 1
1 2 3

  1. 总和:120(total/2 = 60)。

  2. 可行解:格子 (0,0)=10(1,0)=20(1,1)=30(和=60)。

  3. 剩余部分:其他格子连通(通过BFS验证)。

  4. 最小格子数:3(输出结果)。


http://www.hkcw.cn/article/yDKxDnKlIV.shtml

相关文章

中国援喀麦隆医疗队开展义诊活动 情暖六一关爱健康

当地时间5月30日至6月1日,中国(山西)第24批援喀麦隆姆巴尔马尤医疗队在喀麦隆杜阿拉开展了一系列健康公益活动,通过专业医疗服务和人文关怀为中非友谊注入新活力。5月30日,医疗队在中企杜阿拉项目园区进行了健康知识宣讲。医生们通过理论讲解与实操演示,系统培训了AED(自…

【连载22】基础智能体的进展与挑战综述-超对齐

21. 超对齐与人工智能智能体中的安全扩展法则 21.1 超对齐&#xff1a;面向目标的人工智能智能体对齐 随着大规模语言模型&#xff08;LLMs&#xff09;越来越多地成为自主智能体决策的核心&#xff0c;确保它们的输出保持安全、伦理&#xff0c;并始终与人类目标一致&#x…

【技术追踪】InverseSR:使用潜在扩散模型进行三维脑部 MRI 超分辨率重建(MICCAI-2023)

LDM 实现三维超分辨率~ 论文&#xff1a;InverseSR: 3D Brain MRI Super-Resolution Using a Latent Diffusion Model 代码&#xff1a;https://github.com/BioMedAI-UCSC/InverseSR 0、摘要 从研究级医疗机构获得的高分辨率&#xff08;HR&#xff09;MRI 扫描能够提供关于成像…

美科罗拉多州恐袭嫌疑人曝光 FBI定性恐袭

当地时间6月1日,美国科罗拉多州博尔德市一名男子向人群投掷燃烧瓶,造成6人烧伤。受害者年龄在67至88岁之间,均已送医。嫌疑人确认是45岁的穆罕默德苏莱曼,案发后亦因伤入院。FBI局长卡什帕特尔称该事件为“有针对性的恐怖袭击”,并指出FBI已将此案按恐袭处理。副局长丹邦吉…

成都90后小伙让刀剑重获新生 十年磨一剑

在成都邛崃郊外的一间工作室里,一把锈迹斑斑的古刀静静地躺在工作台上。王一凯戴上手套,拿起磨石,开始了又一个漫长的工作日。磨石与刀身接触,发出“嗤嗤”的摩擦声。褐色锈层缓缓剥落,千年前的钢铁本色渐渐显露。这把沉睡已久的古刀,在他手中慢慢苏醒。1991年出生的王一…

白俄罗斯媒体:卢卡申科将访华 深化双边合作

白俄罗斯总统卢卡申科计划于本月2日至4日访问中国。此前,卢卡申科曾表示,白中关系是互利共赢的典范。白方将坚定恪守一个中国原则,并愿与中方共同推进“一带一路”重大项目,发展新质生产力,助力各自的发展振兴。责任编辑:zhangxiaohua

气象部门回应西藏现红色精灵闪电 罕见现象揭秘

5月31日至6月1日,中国摄影师在西藏山南拍到红色精灵闪电。精灵闪电形成于大气中间层,是雷击产生电磁波的结果。据中国天气科普,它在空中存在几十分之一秒,如鬼魅一般难以捉摸。责任编辑:zhangxiaohua

吴恩达MCP课程(4):connect_server_mcp_chatbot

目录 完整代码代码解释1. 导入和初始化2. 类型定义3. MCP_ChatBot 类初始化4. 查询处理 (process_query)5. 服务器连接管理6. 核心特性总结 示例 完整代码 原课程代码是用Anthropic写的&#xff0c;下面代码是用OpenAI改写的&#xff0c;模型则用阿里巴巴的模型做测试 .env 文…

网页前端开发(基础进阶1--盒子模型)

颜色表示方法3种&#xff1a; 1.关键字&#xff1a; color&#xff1a;green&#xff1b; gray red yellow 2.rgb表示法&#xff1a;红&#xff0c;绿&#xff0c;蓝三原色。rgb&#xff08;r&#xff0c;g&#xff0c;b&#xff09;&#xff0c;r表示红色&#xff0c;g表示绿…

中国造船是如何取代韩国霸主地位的 14年激战成就全球王者

在全球造船业的百年激荡中,主导权的更迭总是伴随着技术、规模与国家意志的碰撞。从19世纪的英国,到战后的日本,再到20世纪末的韩国,造船业王冠几度易主。如今,中国以雷霆万钧之势终结了韩国长达20年的霸主地位。2024年,中国造船业以74.7%的新船订单份额,全面改写全球造船…

加沙城四分之三水井被以军摧毁 缺水危机加剧

加沙城政府部门6月1日发布消息称,由于以军摧毁了当地约75%的水井,且剩余水井缺乏正常运行所需燃料,加沙城正面临严重的缺水问题和灾难性危机。该部门警告称,如果国际社会和相关机构不尽快介入,可能会引发严重的健康和环境危机。责任编辑:zhangxiaohua

马克龙接见巴黎圣日耳曼全队 谴责暴力事件

巴黎圣日耳曼队在5月31日晚赢得了欧冠联赛冠军奖杯,法国多地的球迷彻夜庆祝。然而,庆祝活动期间发生了多起暴力事件。据法国内政部消息,狂欢夜有559人因滋事被捕,并发生了两起命案。法国总统马克龙6月1日在爱丽舍宫接见球队时,严厉谴责了这些暴力事件,称其“不可接受”。…

C++实现汉诺塔游戏自动完成

目录 一、汉诺塔的规则二、数学递归推导式三、步骤实现(一)汉诺塔模型(二)递归实现(三)显示1.命令行显示2.SDL图形显示 四、处理用户输入及SDL环境配置五、总结六、源码下载 一、汉诺塔的规则 游戏由3根柱子和若干大小不一的圆盘组成&#xff0c;初始状态下&#xff0c;所有的…

抖音评论数据采集解决方案推荐

内容概要 在当今数字化营销的背景下&#xff0c;抖音作为一款广受欢迎的短视频平台&#xff0c;吸引了众多用户和企业的关注。为了更好地理解用户反馈和优化营销策略&#xff0c;评论数据的采集显得尤为重要。本文将为读者提供一系列系统化的解决方案&#xff0c;涵盖多款高效…

若依框架-代码生成器的使用

1.服务启动 注意一定要启动Gen\GateWay\System 2.创建表 注意一定要写上字段的注释和表的注释。 1.注意主键的命名 2.注意驼峰命名法 3.代码生成 3.1 按照以下箭头步骤&#xff0c;选择生成的表&#xff0c;点击确定 3.2 核对生成表的结构 3.3 编辑生成表的基础信息 3.4 点…

河南46岁卡车司机已下葬 卡友团队千里送别

近日,46岁的河南卡车司机常志荣在青藏高原离世,卡友团队一同将其骨灰接回老家。6月1日,常志荣已经在老家安葬。他去世后留下了重组家庭的6个孩子,其中5个孩子还在上学。车友任先生透露,常志荣出发前同行曾建议他至少携带两罐氧气,但他为了省下30元费用,最终只购买了一罐…

交警回应豪车车主赖停车费被举报酒驾 代驾小哥报警揭发真相

近日,浙江宁波一名兰博基尼车主酒后请代驾将车开到小区,随后自己开车进车库。因不愿支付代驾小哥垫付的5元停车费,被对方举报酒驾。经检测,该车主血液中的酒精含量达59mg/100ml,达到酒驾标准,其驾驶证被扣12分,暂扣6个月,并被处以2000元以下罚款。代驾小哥石先生表示,…

Nat. Commun|借助深度学习分层方法,量化胎盘组织学全切片图像中细胞和显微解剖组织结构的变异性

小罗碎碎念 这篇文章提出了用于胎盘组织学全切片图像分析的深度学习框架HAPPY&#xff0c;其核心是通过三阶段流水线实现从细胞到组织结构的层次化建模。 首先利用RetinaNet定位细胞核。 再通过ResNet-50分类11种细胞类型 最后基于ClusterGCN图神经网络将细胞聚合成9类显微组织…

融智学道函数智慧系统研习(图文并茂)

融智学道函数智慧系统研习&#xff08;图文并茂&#xff09; 融智学创立者邹晓辉亲自设计和审订并规划布局人机互助制作全过程 摘要&#xff1a;本文呈现邹晓辉融智学理论的核心架构&#xff0c;包含四大公式可视化系统&#xff1a;1&#xff09;道函数&#xff08;f_Tao0&am…

小米YU7将推出5款全新车身颜色 更多经典配色即将揭晓

6月1日的消息显示,在5月22日的发布会上,小米YU7公布了四款颜色:钛金属色、宝石绿、熔岩橙和寒武岩灰。官方透露,除了已发布的四款颜色外,还有五款新颜色即将发布。回顾小米SU7刚推出时,提供了9种颜色选择,分为跑车色系、时尚色系、豪华色系和经典色系。基础款中的海湾蓝…