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

在这里插入图片描述

欢迎交流学习~~


专栏: 蓝桥杯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 × n m \times n m×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 = ant
    for 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] = False


if __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 的最大值 100
    count = 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 = 0
    for 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] = True
        for 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 = True
        return
    # 退出条件:没有砝码可用 -- 失败
    elif num < 0:
        return
    else:
        ## 搜索下一个砝码
        # 将这个砝码放在物品的不同侧
        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 = i
        tag = False
        dfs(n-1, 0)

        # 输出结果
        if tag:
            print('YES')
        else:
            print('NO')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/1405.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

四、快速上手 ODM 操作 Mongodb

文章目录一、ODM 的选择和安装二、MongoEngine 模型介绍三、文档的嵌套模型四、使用 ODM 查询数据4.1 查询一个文档4.2 条件查询4.3 统计、排序和分页五、使用 ODM 新增数据六、使用 ODM 修改和删除数据一、ODM 的选择和安装 MongoEngine&#xff1a; 使用最为广泛的 ODM。htt…

【C++】命名空间

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;C的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、命名空间产生的背景二、命名空…

基础篇:07-Nacos注册中心

1.Nacos安装部署 1.1 下载安装 nacos官网提供了安装部署教程&#xff0c;其下载链接指向github官网&#xff0c;选择合适版本即可。如访问受阻可直接使用以下最新稳定版压缩包&#xff1a;&#x1f4ce;nacos-server-2.1.0.zip&#xff0c;后续我们也可能会更改为其他版本做更…

图论学习(五)

极图 l部图的概念与特征 定义&#xff1a;若简单图G的点集V有一个划分&#xff1a; 且所有的Vi非空&#xff0c;Vi内的点均不邻接&#xff0c;设G是一个l部图。 如果l2&#xff0c;则G就是偶图。n阶无环图必是n部图。若l1<l2≤n&#xff0c;则任意的l1部图也是l2部图。…

【毕业设计】基于SpringBoot+Vue论坛管理系统【源码(完整源码请私聊)+论文+演示视频+包运行成功】

您好&#xff0c;我是码农飞哥&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通 &#x1f601; 2. 毕业设计专栏&…

JavaScript学习笔记(7.0)

<!--* Author: RealRoad1083425287qq.com* Date: 2023-03-13 14:50:18* LastEditors: Mei* LastEditTime: 2023-03-13 15:08:54* FilePath: \vscode\鼠标跟随.html* Description: * * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved. --> <!DOCTYPE …

Vue3(递归组件) + 原生Table 实现树结构复杂表格

一、递归组件 什么是递归&#xff0c;Javascript中经常能接触到递归函数。也就是函数自己调用自己。那对于组件来说也是一样的逻辑。平时工作中见得最多应该就是菜单组件&#xff0c;大部分系统里面的都是递归组件。文章中我做了按需引入的配置&#xff0c;所以看不到我引用组…

什么是让ChatGPT爆火的大语言模型(LLM)

什么是让ChatGPT爆火的大语言模型(LLM) 更多精彩内容: https://www.nvidia.cn/gtc-global/?ncidref-dev-876561 文章目录什么是让ChatGPT爆火的大语言模型(LLM)大型语言模型有什么用&#xff1f;大型语言模型如何工作&#xff1f;大型语言模型的热门应用在哪里可以找到大型语言…

西安石油大学C语言期末真题实战

很简单的一道程序阅读题&#xff0c;pa’默认为a【0】&#xff0c;接下来会进行3次循环 0 1 2 输出结果即可 前3题就是一些基础定义&#xff0c;在此不多赘述 要注意不同的数据类型的字节数不同 a<<2 b>>1&#xff08;b>>1;就是说b自身右位移一位&#xff08…

支付系统设计:消息重试组件封装

文章目录前言一、重试场景分析一、如何实现重试1. 扫表2. 基于中间件自身特性3. 基于框架4. 根据公司业务特性自己实现的重试二、重试组件封装1. 需求分析2. 模块设计2.1 持久化模块1. 表定义2. 持久化接口定义3. 持久化配置类2.2 重试模块1.启动2.重试3. 业务端使用1. 引入依赖…

Linux基础(3) Vim编辑器与Shell命令脚本

1、VIM文本编辑器 VIM编辑器的三大模式 命令模式&#xff1a; 控制光标移动&#xff0c;可对文本进行复制、粘贴和查找等工作输入模式&#xff1a; 正常的文本录入。末行模式&#xff1a; 保存或退出文档&#xff0c;以及设置编辑环境三种模式的切换&#xff1a; ​注意&…

app自动化测试——Android studio安装与配置

文章目录一、Appium框架介绍二、Appium 生态工具三、环境安装四、安装Android studio五、配置环境变量六、创建模拟器查看设备启动模拟器一、Appium框架介绍 1、跨语言&#xff1a;java、python等 2、跨平台&#xff1a;Android、IOS、Windows、Mac 3、底层多引擎切换 4、生态…

(待补充)小蒟蒻的刷题成长之路-------2023年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛(同步赛)

小蒟蒻的刷题成长之路 蓝桥杯的比赛流程和必考点_蓝桥杯省赛考点_时雨h的博客-CSDN博客 大一学生一周十万字爆肝版C语言总结笔记_大一c语言笔记_时雨h的博客-CSDN博客 程序设计与 C 语言期末复习_时雨h的博客-CSDN博客 P8597 [蓝桥杯 2013 省 B] 翻硬币个人思考总结第五届传智杯…

西瓜视频登录页面

题目 代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>登录页面</title><style>td{width: 160px;height: 25px;}img{width: 20px;height: 20px;}.number, .password{background: rgba(0,0,0,.05);}.numbe…

指针进阶(上)

内容小复习&#x1f431;&#xff1a; 字符指针:存放字符的数组 char arr1[10]; 整型数组:存放整型的数组 int arr2[5]; 指针数组:存放的是指针的数组 存放字符指针的数组(字符指针数组) char* arr3[5]; 存放整型指针的数组(整型指针数组) int* arr[6]; 下面进入学习了哦~&…

【二分查找】

二分查找704. 二分查找35. 搜索插入位置34. 在排序数组中查找元素的第一个和最后一个位置结语704. 二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在…

mybatis中获取参数的两种方式:${}和#{}

目录 1.#{} 2.${} 3.总结 1.#{} 本质是占位符赋值 示例及执行结果&#xff1a; 结论&#xff1a;通过执行结果可以看到&#xff0c;首先对sql进行了预编译处理&#xff0c;然后再传入参数&#xff0c;有效的避免了sql注入的问题&#xff0c;并且传参方式也比较简单&#xf…

Python制作9行最简单音乐播放器?不,我不满足

人生苦短 我用python 好久不见啦~这次就来给大家整个大福利 ~ 源码资料电子书:点击此处跳转文末名片获取 最简单的9行代码音乐播放器如下&#xff1a; import time import pygamefile r歌曲路径 pygame.mixer.init() print(正在播放,file) track pygame.mixer.music.load(f…

计算机面试常见问答题目

英语口语 自我介绍 Hello, teachers. My name is Wang Xu. I come from Ningxia. I graduated from the School of Computer Science, Xi an Jiaotong University, majoring in Internet of Things. Next, I will introduce myself from four aspects. First of all, I studi…

Java开发 - ELK初体验

前言 前面我们讲过消息队列&#xff0c;曾提到消息队列也具有保存消息日志的能力&#xff0c;今天要说的EL看也具备这个能力&#xff0c;不过还是要区分一下功能的。消息队列的日志主要指的是Redis的AOF&#xff0c;实际上只是可以利用了消息队列来保存&#xff0c;却并不是消…