Python|蓝桥杯进阶第四卷——图论
迪丽瓦拉
2025-05-30 13:25:42
0

在这里插入图片描述

欢迎交流学习~~


专栏: 蓝桥杯Python组刷题日寄


蓝桥杯进阶系列:

🏆 Python | 蓝桥杯进阶第一卷——字符串
🔎 Python | 蓝桥杯进阶第二卷——贪心
💝 Python | 蓝桥杯进阶第三卷——动态规划
✈️ Python | 蓝桥杯进阶第四卷——图论
🌞 Python | 蓝桥杯进阶第五卷——数论(待续)
🌠 Python | 蓝桥杯进阶第六卷——递归(待续)
💎 Python | 蓝桥杯进阶第七卷——搜索(待续)

Python|蓝桥杯进阶第四卷——图论

  • 🎁 剪格子
  • 🚀 卡勒沃夫之弱水路三千
  • 🍞 盾神与砝码称重


🎁 剪格子

题目:
时间限制:
1s

内存限制:
128MB

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

+--*--+--+
|10*  1|52|
+--****--+
|20|30*  1|
*******--+
|  1|  2|  3|
+--+--+--+ 

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

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

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

输入描述:
程序先读入两个整数 m n 用空格分割 (m,n< 10)
表示表格的宽度和高度。
接下来是 n 行,每行 m 个正整数,用空格分开。每个整数不大于 10000

输出描述:
输出一个整数,表示在所有解中,包含左上角的分割区可能包含的最小的格子数目。

样例输入:

3 3
10 1 52
20 30 1
1 2 3

样例输出:
3


解题思路

利用深度优先搜索。
对于题目给出的格子数据,我们可以在周围一圈加上一圈 0,这样就可以避免考虑边界情况。

具体思路可以见下面代码及其注释。


参考代码

# 深度优先搜索
def dfs(n, m, cell, visited, cell_sum, x, y, dx, dy, ant, res):global count# count 表示所有方法的最小格子数# ant 表示当前方法的格子数if (res == cell_sum//2) and count > ant:count = antfor i in range(4):# 同一区域的数字相邻,即只能向四个方向走x0 = x + dx[i]y0 = y + dy[i]if x0 >= 1 and x0 <= m and y0 >= 1 and y0 <= n and not visited[x0][y0]:visited[x][y] = True# 递归dfs(n, m, cell, visited, cell_sum, x0, y0, dx, dy, ant+1, res+cell[x0][y0])# 回溯visited[x0][y0] = Falseif __name__ == '__main__':m, n = map(int, input().split())# 将原格子边界一圈都设置为0,方便后续处理cell = [[0 for j in range(m+2)] for i in range(n+2)]for i in range(1, n+1):tmp = [0] + list(map(int, input().split())) + [0]cell[i] = tmp# count 表示所有方法的最小格子数,初始化为 m*n 的最大值 100count = 100# visited 用来记录该位置是否被访问过visited = [[False for j in range(m+2)] for i in range(n+2)]visited[1][1] = True# dx, dy 对应四个方向的坐标变化dx = [0, 1, 0, -1]dy = [1, 0, -1, 0]# cell_sum 为格子所有数字之和cell_sum = 0for i in range(1, n+1):for j in range(1, m+1):cell_sum += cell[i][j]if cell_sum%2 == 1:# cell_sum 为奇数print(0)else:# res 表示目前访问过节点数字的总和res = cell[1][1]dfs(n, m, cell, visited, cell_sum, 1, 1, dx, dy, 1, res)if count == 100:print(0)else:print(count)

🚀 卡勒沃夫之弱水路三千

题目:
时间限制:
1s

内存限制:
128MB

题目描述:
锦瑟年华谁与度 莫问情归处 只影向斜阳 剑吼西风 欲把春留驻
天涯芳草无归路 回首花无数 解语自销魂 弱袂萦春 尘缘不相误

在卡勒沃夫充满文学杀伤力的声音中,身处紫荆2号楼202B的四位远近高低各不同的室友纷纷回忆起了各自波澜起伏的过去,并对长在百草园,邻有百花谷的现状表达了各自的见解。
某Q:" …我小学就开窍了…她的父母说我很好,但是…今天又和北林的联系了…"
某X:" …差点就成了,结果到学校了…这个方法放假了我去对我的同桌用!…"
某W:" …" (千言万语不言中,有大量的故事等待考古)
某Z:" …为了来清华…咱们审美观不一样,不会抢…"

卡勒沃夫在这个不朽的夜话中搜集出了某人零散的历任女友资料,为了强迫某人将他出的题目的标程交出,现在卡勒沃夫需要一个能将这些零散信息整合起来的程序。

输入描述:
第一行为一个不超过 5 的整数 T,表示数据的组数。之后每组数据的一行为一个不超过 100 的整数 n。之后 n 行每行有两个用单个空格隔开的字符串(每个字符串只有英文大小写字母,长度不超过 10),为两位 mm 的名字。每行第一个 mm 先于第二个 mm 成为某人的女友。
在这里我们假装诅咒某人不会同时被两个或两个以上 mm 泡,某个 mm 抛弃了某人后不会再吃回头草,同时卡勒沃夫深邃的洞察力使得他收集到了充足的信息以确定某人女友的先后顺序。
在小数据组中出现的人物不超过 13 个.

输出描述:
输出 T 行,每行对应一组数据,并按照 mm 们从先到后成为某人女友的顺序输出她们的名字,各个名字间用一个空格隔开。

样例输入:

2 
2 
RY  Unknown 
YSZ  RY 
3 
tomorrow  yestoday 
tomorrow  today 
today  yestoday 

样例输出:

YSZ RY Unknown
tomorrow today yestoday

解题思路

本题思路是拓扑排序。

具体思路见参考代码代码和注释。


参考代码

from collections import defaultdict
"""
defaultdict 是 collections 模块中的一个类。
它继承自 Python 内置的 dict 类
但是与 dict 类不同的是,defaultdict 会自动为访问的不存在的键赋一个默认值。
这样在使用 defaultdict 时就不需要像在使用 dict 时那样先判断一个键是否存在,再进行对应的操作。
"""
class Graph:def __init__(self):# 每个键对应的值为一个列表,用来存储该键值作为起点对应的终点self.graph = defaultdict(list)def addEdge(self, u, v):# 添加一条以 u 为起点,v 为终点的边self.graph[u].append(v)# 拓扑排序函数def topoLogicalSortUtil(self, key, visited, stack):# 标记该结点为已访问visited[key] = Truefor i in self.graph[key]:if visited[i] == False:self.topoLogicalSortUtil(i, visited, stack)# 用一个栈来保存排序结点stack.append(key)def topoLogicalSort(self, dic):visited = dic.copy()stack = []for key in dic.keys():# 判断该结点是否被访问过if visited[key] == False:# 如果没有被访问过self.topoLogicalSortUtil(key, visited, stack)# 栈是先进后出,因此需要倒序输出for i in stack[::-1]:print(i, end=' ')print()t = int(input())
while t:# dic 用来保存结点状态:是否被访问过# start, end 分别存储起点和终点dic, start, end = {}, [], []n = int(input())for i in range(n):a, b = input().split()start.append(a)end.append(b)# grils 利用集合去重,可以得到所有结点(即所有前女友名字)grils = set(start + end)# 创建 Graph 类gf_graph = Graph()# 添加边for i in zip(start, end):gf_graph.addEdge(i[0], i[1])# 初始化结点状态for i in grils:dic.update({i: False})# 拓扑排序gf_graph.topoLogicalSort(dic)t -= 1

🍞 盾神与砝码称重

题目:
时间限制:
1s

内存限制:
128MB

题目描述:
有一天,他在宿舍里无意中发现了一个天平!这个天平很奇怪,有n个完好的砝码,但是没有游码。盾神为他的发现兴奋不已!于是他准备去称一称自己的东西。他准备好了 m 种物品去称。神奇的是,盾神一早就 知道这 m 种物品的重量,他现在是想看看这个天平能不能称出这些物品出来。但是盾神稍微想了1秒钟以后就觉得这个问题太无聊了,于是就丢给了你。

输入描述:
第一行为两个数,nm
第二行为 n 个数,表示这 n 个砝码的重量。
第三行为 m个数,表示这 m 个物品的重量。

数据规模和约定
1 <= n <= 24, 1 <= m <= 10.
输出描述:
输出 m 行,对于第 i 行,如果第 i 个物品能被称出,输出 YES 否则输出 NO

样例输入:

4 2
1 2 4 8
15 16

样例输出:

YES
NO

解题思路

深度优先搜索。

注意每个砝码有三种状态:

  • 砝码和物品放在不同侧;
  • 不使用该砝码
  • 砝码和物品放在同一侧

对于每一个称重物品,逐个考虑砝码的三种状态,进行搜索。

具体见参考代码和注释。


参考代码

# 深度优先搜索
def dfs(num, res):global weight, tag, w01# 退出条件:达到物品的重量 -- 成功if res == weight:tag = Truereturn# 退出条件:没有砝码可用 -- 失败elif num < 0:returnelse:## 搜索下一个砝码# 将这个砝码放在物品的不同侧dfs(num - 1, res + int(w01[num]))# 不使用第 i 个砝码dfs(num - 1, res)# 将这个砝码和物品放在同一侧dfs(num - 1, res - int(w01[num]))if __name__ == '__main__':# 输入n, m = map(int, input().split())# w01, w02 分别为砝码和物品重量w01 = list(map(int, input().split()))w02 = list(map(int, input().split()))# 对于每一个物品for i in w02:weight = itag = Falsedfs(n-1, 0)# 输出结果if tag:print('YES')else:print('NO')

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...