2024蓝桥杯每日一题(DFS)

备战2024年蓝桥杯 -- 每日一题
Python大学A组

        试题一:奶牛选美
        试题二:树的重心
        试题三:大臣的差旅费
        试题四:扫雷


试题一:奶牛选美

【题目描述】

        听说最近两斑点的奶牛最受欢迎,约翰立即购进了一批两斑点牛。不幸的是,时尚潮流往往变化很快,当前最受欢迎的牛变成了一斑点牛。约翰希望通过给每头奶牛涂色,使得它们身上的两个斑点能够合为一个斑点,让它们能够更加时尚。牛皮可用一个 N×M的字符矩阵来表示,如下所示:

................
..XXXX....XXX...
...XXXX....XX...
.XXXX......XXX..
........XXXXX...
.........XXX....

        其中,X表示斑点部分。如果两个 X在垂直或水平方向上相邻(对角相邻不算在内),则它们属于同一个斑点,由此看出上图中恰好有两个斑点。约翰牛群里所有的牛都有两个斑点。约翰希望通过使用油漆给奶牛尽可能少的区域内涂色,将两个斑点合为一个。在上面的例子中,他只需要给三个 .. 区域内涂色即可(新涂色区域用 ∗ 表示):

................
..XXXX....XXX...
...XXXX*...XX...
.XXXX..**..XXX..
........XXXXX...
.........XXX....

        请帮助约翰确定,为了使两个斑点合为一个,他需要涂色区域的最少数量。

【输入格式】

        第一行包含两个整数 N和 M。

        接下来 N 行,每行包含一个长度为 M 的由 X 和 .. 构成的字符串,用来表示描述牛皮图案的字符矩阵。

【输出格式】

        输出需要涂色区域的最少数量。

【数据范围】

        1≤N,M≤50

【输入样例】

6 16
................
..XXXX....XXX...
...XXXX....XX...
.XXXX......XXX..
........XXXXX...
.........XXX....

【输出样例】

3

【解题思路】

        用2次BFS,第一次用来找出两个斑点,第二次用来找最短的连接线。

【Python程序代码】

from collections import *
n,m = map(int,input().split())
a = []
for i in range(n):
    a.append(list(input()))
st = [[0]*(m+5) for _ in range(n+5) ]
t,f = 1,0
for i in range(n):
    for j in range(m):
        if a[i][j]=='X' and st[i][j]==0:
            q=deque()
            q.append([i,j])
            st[i][j]=t
            while q:
                tx,ty = q.popleft()
                for zx,zy in [(-1,0),(1,0),(0,-1),(0,1)]:
                    nx,ny = tx+zx,ty+zy
                    if nx<0 or nx>=n or ny<0 or ny>=m:continue
                    if a[nx][ny]=='.' or st[nx][ny]:continue
                    st[nx][ny]=t
                    q.append([nx,ny])
            t += 1

def bfs(i_,j_):
    q = deque()
    q.append([i_,j_,0])
    vis = [[0]*(m+5) for _ in range(n+5) ]
    vis[i_][j_]=1
    while q:
        tx,ty,z = q.popleft()
        if st[tx][ty]==2:
            return z
        for zx,zy in [(-1,0),(1,0),(0,1),(0,-1)]:
            nx,ny = tx+zx,ty+zy
            if nx < 0 or nx >= n or ny < 0 or ny >= m: continue
            if vis[nx][ny]: continue
            vis[nx][ny]=1
            q.append([nx,ny,z+1])

    return 0


res = n*m
for i in range(n):
    for j in range(m):
        if st[i][j]==1:
            tep = bfs(i,j)
            res = min(res,tep)
print(res-1)


试题二:树的重心

【题目描述】

        给定一颗树,树中包含 n个结点(编号 1∼n)和 n−1 条无向边。请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。

【输入格式】

        第一行包含整数 n,表示树的结点数。

        接下来 n−1行,每行包含两个整数 a 和 b,表示点 a 和点 b 之间存在一条边。

【输出格式】

        输出一个整数 m,表示将重心删除后,剩余各个连通块中点数的最大值。

【数据范围】

        1≤n≤100000

【输入样例】

9
1 2
1 7
1 4
2 8
2 5
4 3
3 9
4 6

 【输出样例】

4

【解题思路】

         本体上就是一个树的遍历问题,遍历去掉每一个点,找出答案。

【Python程序代码】

n = int(input())
h,e,ne,idx = [-1]*(n+5),[0]*(2*n+5),[0]*(2*n+5),0
def add(a,b):
    global idx
    e[idx]=b; ne[idx]=h[a]; h[a]=idx; idx+=1
for i in range(n-1):
    a,b = map(int,input().split())
    add(a,b); add(b,a)
ans,st = n,[False]*(n+5)
def dfs(u):
    global ans
    st[u]=True
    res,sumv = 0,1
    i = h[u]
    while i!=-1:
        j = e[i]
        if not st[j]:
            s = dfs(j)
            res = max(res,s)
            sumv += s
        i = ne[i]
    res = max(res,n-sumv)
    ans = min(ans,res)
    return sumv
dfs(1)
print(ans)

试题三: 大臣的旅费

【题目描述】

        很久以前,T王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。为节省经费,T 国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。J 是 T 国重要大臣,他巡查于各大城市之间,体察民情。所以,从一个城市马不停蹄地到另一个城市成了 J最常做的事情。他有一个钱袋,用于存放往来城市间的路费。聪明的 J发现,如果不在某个城市停下来修整,在连续行进过程中,他所花的路费与他已走过的距离有关。具体来说,一段连续的旅途里,第 1千米的花费为 11,第 2 千米的花费为 12,第 3 千米的花费为 13,…,第 x 千米的花费为 x+10。也就是说,如果一段旅途的总长度为 1 千米,则刚好需要花费 11,如果一段旅途的总长度为 2 千米,则第 1千米花费 11,第 2 千米花费 12,一共需要花费 11+12=23。J 大臣想知道:他从某一个城市出发,中间不休息,到达另一个城市,所有可能花费的路费中最多是多少呢?

【输入样例】

【输出格式】

        输出一个整数,表示大臣 J 最多花费的路费是多少。

【数据范围】

【输入样例】

5
1 2 2
1 3 1
2 4 5
2 5 4

【输出样例】

135

【解题思路】

         可以发现本题就是求树的直径的问题,经典做法就是先遍历找出距离点d最远的点x,然后找到距离x点最优的y点,其中x到y的距离就是树的直径。

【Python程序代码】

n = int(input())
mp = [[]for i in range(n+1)]
for i in range(n-1):
    a,b,c = map(int,input().split())
    mp[a].append([b,c])
    mp[b].append([a,c])
dist = [0]*(n+1)
def dfs(st,father,distance):
    dist[st] = distance
    for b,c in mp[st]:
        if b!=father:
            dfs(b,st,distance+c)
dfs(1,-1,0)
u = 1
for i in range(1,n+1):
    if dist[i]>dist[u]:u=i
dfs(u,-1,0)
for i in range(1,n+1):
    if dist[i]>dist[u]:u=i
s = dist[u]
print( s*10 + s*(1+s)//2 )   

 试题四:扫雷

【题目描述】

        小明最近迷上了一款名为《扫雷》的游戏。其中有一个关卡的任务如下:在一个二维平面上放置着 n 个炸雷,第 i个炸雷 (xi,yi,ri)表示在坐标 (xi,yi)(处存在一个炸雷,它的爆炸范围是以半径为 ri 的一个圆。为了顺利通过这片土地,需要玩家进行排雷。玩家可以发射 m 个排雷火箭,小明已经规划好了每个排雷火箭的发射方向,第 j 个排雷火箭 (xj,yj,rj)表示这个排雷火箭将会在 (xj,yj)处爆炸,它的爆炸范围是以半径为 rj 的一个圆,在其爆炸范围内的炸雷会被引爆。同时,当炸雷被引爆时,在其爆炸范围内的炸雷也会被引爆。现在小明想知道他这次共引爆了几颗炸雷?你可以把炸雷和排雷火箭都视为平面上的一个点。一个点处可以存在多个炸雷和排雷火箭。当炸雷位于爆炸范围的边界上时也会被引爆。

【输入格式】

        输入的第一行包含两个整数 n、m。

        接下来的 n 行,每行三个整数 xi,yi,ri表示一个炸雷的信息。

        再接下来的 m 行,每行三个整数 xj,yj,rj表示一个排雷火箭的信息。

【输出格式】

        输出一个整数表示答案。

【数据范围】  

【输入样例】

2 1
2 2 4
4 4 2
0 0 5

【输出样例】

2

 【解题思路】

        首先,对在同一点的炸雷和排雷火箭进行去重处理,然后枚举每一个排雷火箭,遍历排雷范围,如果能扫到雷则该炸雷也存放到排雷火箭队列。最后用排雷火箭队列模拟排雷。

【Python程序代码】

import sys
from collections import *
input = sys.stdin.readline
n, m = map(int, input().split())
num = Counter()
find = dict()
for _ in range(n):
    x, y, r = map(int, input().split())
    if (x, y) not in find:
        find[(x, y)] = 0
    num[(x, y)] += 1
    find[(x, y)] = max(find[(x, y)], r)
pq = deque()
f = dict()
for _ in range(m):
    x, y, r = map(int, input().split())
    if (x, y) not in f:
        f[(x, y)] = 0
    f[(x, y)] = max(f[(x, y)], r)
for (x, y), r in f.items():
    for i in range(x - r, x + r + 1):
        for j in range(y - r, y + r + 1):
            if (i - x) ** 2 + (j - y) ** 2 <= r ** 2:
                if (i, j) in find:
                    pq.append((i, j, find[(i, j)]))
                    del find[(i, j)]
res = 0
while pq:
    x, y, r = pq.popleft()
    res += num[(x, y)]
    for i in range(x - r, x + r + 1, 1):
        for j in range(y - r, y + r + 1, 1):
            if (i - x) ** 2 + (j - y) ** 2 <= r ** 2:
                if (i, j) in find:
                    pq.append((i, j, find[(i, j)]))
                    del find[(i, j)]
print(res)

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

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

相关文章

【云呐】固定资产管理系统的功能有哪些?管理工具

为了提高经营效率&#xff0c;降低企业成本&#xff0c;许多企业选择固定资产管理系统。那么&#xff0c;固定资产管理系统有什么作用呢&#xff1f; 资产登记&#xff1a;  固定资产管理系统可以方便地登记公司的固定资产&#xff0c;包括资产名称、规格型号、购买日期、使…

18个惊艳的可视化大屏(第26辑):航空与运输业

hello&#xff0c;我是贝格前端工场老司机&#xff0c;这是第26期了&#xff0c;本次带来可视化大屏在航空与运输业的应用案例&#xff0c;喜欢文章的别忘点赞关注&#xff0c;文章底部也有其他行业的案例。 可视化大屏在航空与运输业中具有以下九大价值&#xff1a; 实时监控…

新火种AI|英伟达GTC大会在即,它能否撑住场面,为AI缔造下一个高度?

作者&#xff1a;小岩 编辑&#xff1a;彩云 英伟达不完全属于AI行业&#xff0c;但神奇的是&#xff0c;整个AI领域都有着英伟达的传说。因为几乎所有的AI巨头都需要英伟达的芯片来提供算力支持。 也正因此&#xff0c;纵使AI赛道人来人往&#xff0c;此起彼伏&#xff0c;…

Netty中的核心概念

事件传播机制 当pipeline中有多个handler时&#xff0c;netty内部的事件是如何向后传递到每个handler中的&#xff1f; 结论&#xff1a;需要在当前handler中手动将当前事件传递下去 1&#xff0c;如果handler是直接实现的接口&#xff0c;使用ChannelHandlerContext的fireXXX…

针对BSV区块链新推出的网络访问规则NAR和警报系统AS的解释与问答

​​发表时间&#xff1a;2024年2月22日 BSV区块链社区团队最近开设了一个Twitter&#xff08;X&#xff09;话题空间&#xff0c;讨论BSV区块链协会最新推出的网络访问规则和警报系统的相关问题。 本次讨论由BSV区块链社区负责人Brett Banfe主持&#xff0c;以便社区成员更好…

【开源】SpringBoot框架开发毕业生追踪系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登陆注册模块2.2 学生基本配置模块2.3 就业状况模块2.4 学历深造模块2.5 信息汇总分析模块2.6 校友论坛模块 三、系统设计3.1 用例设计3.2 实体设计 四、系统展示五、核心代码5.1 查询我的就业状况5.2 初始化就业状况5.…

正则表达式总结-满满干货拿走不谢

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

elasticsearch基础学习

elasticsearch简介 什么是elasticsearch elasticsearch&#xff08;简称es&#xff09;&#xff0c;其核心是 Elastic Stack&#xff0c;es是一个基于 Apache Lucene&#xff08;TM&#xff09;的开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据…

nginx stream四层加载多个子配

nginx.conf中写 stream.ini中写 gc.ini配置 在这里插入图片描述 nginx -t

第四天 Kubernetes集群的日志及监控-更新版

第四天 Kubernetes集群的日志及监控 k8s日志收集架构 https://kubernetes.io/docs/concepts/cluster-administration/logging/ 总体分为三种方式&#xff1a; 使用在每个节点上运行的节点级日志记录代理。在应用程序的 pod 中&#xff0c;包含专门记录日志的 sidecar 容器。…

问了 Gemini 1.5 Pro 五个问题,找到了初遇ChatGPT的感觉

一个月前&#xff08;2月15日&#xff09;&#xff0c;Sora和 Gemini 1.5 同时推出&#xff0c;这个故事很多人都听过了&#xff0c;Google 被冠以 AI 界汪峰的名头。 人们纷纷震惊于 Sora 的强大&#xff0c;讨论 Sora 是不是世界模型。而 Gemini 1.5 的第一个模型 Gemini 1.…

静态HTML5接入海康websocket视频流|海康ws视频流接入H5页面

引言 海康提供了vue实现插件播放视频的实例&#xff0c;实现取流失败了之后重新获取新的流播放视频&#xff0c;但是在很多情况下需要在静态HTML项目中进行视频的播放&#xff0c;于是引出此文。 海康开放平台SDK下载地址&#xff1a;https://open.hikvision.com/download/5c6…

【CSP试题回顾】202309-1-坐标变换(其一)

CSP-202309-1-坐标变换&#xff08;其一&#xff09; 解题代码 #include <iostream> using namespace std;long long n, m, dx, dy, x, y;int main() {cin >> n >> m;for (size_t i 0; i < n; i){int dx_i, dy_i;cin >> dx_i >> dy_i;dx …

【IEEE】Multimodal Machine Learning: A Survey and Taxonomy

不废话&#xff0c;先上思维导图&#xff0c;哈哈哈&#xff01; 论文题目Machine Learning: A Survey and Taxonomy作者Tadas Baltrusaitis , Chaitanya Ahuja , and Louis-Philippe Morency状态已读完会议或者期刊名称IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE IN…

【视频图像取证篇】模糊图像增强技术之锐化类滤波场景应用小结

【视频图像取证篇】模糊图像增强技术之锐化类滤波场景应用小结 模糊图像增强技术之锐化类滤波场景应用小结—【蘇小沐】 &#xff08;一&#xff09;锐化类滤波器 模糊消除类滤波器&#xff08;Remove blur / Unsharpness&#xff09;。 通用去模糊滤波器&#xff1a;针对大…

Excel·VBA指定目标值切割分组

看到一个帖子《excel吧-数据切断分组问题》&#xff0c;对1列数据按指定长度进行切割分组&#xff0c;获取每组的长度组成方式 VBA代码 Sub 数据分割()Dim arr, target, brr, res, x&, y&, i&, 差额, trr(1 To 2) trr(0)为数值&#xff0c;trr(1)为组成方式arr…

【工具篇】我用Anki半个月背完了408

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本文讲解Anki工具的高效使用&#xff0c;期待与你一同探索、学习、进步&#xff0c;一起卷起来叭&#xff01; 目录 一、记忆的原理二、Anki是什么三、同步服务器搭建 一、记忆…

牛客DP34 前缀和

解题思路 题目解析如图 思路 算出每个位置的到第一个位置的总和 比如 第一个位置 1 总和 1 第二个位置 2 总和 3 第三个位置 4 总和 7 要算 2到3 位置的前缀和 用3位置的总和减去1位置的总和即可 还要处理一个边界情况 如果1到1位置的前缀和那么就是 …

为 java 开发者设计的性能测试框架,用于压测+测试报告生成

拓展阅读 junit5 系列教程 基于 junit5 实现 junitperf 源码分析 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) Junit performance rely on junit5 and jdk8.(java 性能测试框架。压测测试报告生成。) junitperf junitperf 是一款为 java 开…

2024-03-18 作业

作业要求&#xff1a; 1> 将广播发送端和接收端各实现一遍 2> 将组播发送端和接收端各实现一遍 3> 将流式域套接字的服务器端和客户端各实现一遍 1&#xff1a;将广播发送端和接收端各实现一遍 运行代码&#xff1a; 服务端&#xff1a; 客户端&#xff1a; 运行截…