DFS-蓝桥杯常用Python算法

DFS

蓝桥杯中的DFS主要有针对分配过程的DFS和图/树的DFS两种类型,基本是模板题,难度中等

类型一:针对分配过程的DFS

例题 1:飞机降落

题目描述:

N 架飞机准备降落到某个只有一条跑道的机场。其中第 i 架飞机在 T i T_i Ti 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 D i D_i Di 个单位时间,即它最早可以于 T i T_i Ti 时刻开始降落,最晚可以于 T i + D i T_i + D_i Ti+Di 时刻降落。降落过程需要 L i L_i Li 个单位时间。
一架飞机降落完毕时,另一架飞机可以立即在同一时刻开始降落,但是不能在前一架飞机完成降落前开始降落。请判断n架飞机是否能够全部安全降落。

输入格式:

输入包含多组数据,第一行包含一个整数 T T T,表示测试数据的组数。
对于每组数据,第一行包含一个整数N
以下 N 行,每行包含三个整数: T i , D i , L i T_i,D_i,L_i Ti,Di,Li

输出格式:

对于每组数据,输出 Y E S YES YES 或者 N O NO NO,代表是否可以全部安全降落。

代码示例:

from sys import setrecursionlimit
setrecursionlimit(10000)def dfs(flight, landed, amount, cur_time, pre_lander):if pre_lander == amount:# all of the flights have already landedreturn True# choose the current flightfor i in range(amount):if landed[i]:continue# hasn't landed yetif flight[i][1] < cur_time:# the fuel have run out, this schedule is wrongreturn False# it can land landed[i] = Trueif dfs(flight, landed, amount, max(cur_time, flight[i][0])+flight[i][2],pre_lander+1):return Trueelse:# try againlanded[i] = False# no suitable answerreturn Falsetimes = int(input())
for _ in range(times):n = int(input())flight = []for i in range(n):# create a list to record the earliest and latest time that every flight can landa,b,c = map(int, input().split())flight.append(a,a+b,c)landed = [False]*nif dfs(flight, landed, n, 0, 0):print('YES')else:print('NO')

例题 2:分糖果

问题描述:

两种糖果分别有9个和16个,要全部分给7个小朋友,每个小朋友得到的糖果总数最少为2个最多为5个,问有多少种不同的分法,糖果必须全部分完。如果有其中一个小朋友在两种方案中分到的糖果不完全相同,这两种方案就算作不同的方案。

答案提交:

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只输出这个整数,输出多余的内容将无法得分。

题目答案:

35813063

要点:
注意递归处理的子问题是单个小朋友的分配问题,不是某一颗糖的分配问题,因为糖会出现重复,无法去重

代码示例:

# 核心是去重
def dfs(cur,a,b):global cnt# start from 1if cur >= 8:# every child has gotten his candy# check whether all of the candy have been given awayif a == 0 and b == 0:cnt += 1return# use for loops to avoid repeatly countfor i in range(a+1):for j in range(b+1):if 2 <= i+j <= 5:dfs(cur+1, a-i, b-j)
cnt = 0
# dfs(1,9,16)
print(5067671)

类型二:树的DFS

例题 1:景区导游

题目链接:景区导游(蓝桥杯)

题目要求:

某景区一共有 N 个景点,编号 1 到 N。景点之间共有 N − 1 条双向的摆渡车线路相连,形成一棵树状结构。在景点之间往返只能通过这些摆渡车进行,需要花费一定的时间。
小明是这个景区的资深导游,他每天都要按固定顺序带客人游览其中 K 个景点: A 1 , A 2 , . . . , A K A_1, A_2, . . . , A_K A1,A2,...,AK。今天由于时间原因,小明决定跳过其中一个景点,只带游客按顺序游览其中 K − 1 个景点。具体来说,如果小明选择跳过 Ai,那么他会按顺序带游客游览 A 1 , A 2 , . . . , A i − 1 , A i + 1 , . . . , A k , ( 1 ≤ i ≤ K ) A_1, A_2, . . . , A_{i−1}, A_{i+1}, . . . , A_k, (1 ≤ i ≤ K) A1,A2,...,Ai1,Ai+1,...,Ak,(1iK)
请你对任意一个 A i A_i Ai,计算如果跳过这个景点,小明需要花费多少时间在景点之间的摆渡车上?

输入格式:

第一行包含 2 个整数 N 和 K。以下 N − 1 行,每行包含 3 个整数 u, v 和 t,代表景点 u 和 v 之间有摆渡车线路,花费 t 个单位时间。最后一行包含 K 个整数 A 1 , A 2 , . . . , A k A_1, A_2, . . . , A_k A1,A2,...,Ak 代表原定游览线路。

输出格式:

输出 K 个整数,其中第 i 个代表跳过 A i A_i Ai 之后,花费在摆渡车上的时间。

提示:

对于 20% 的数据, 2 ≤ K ≤ N ≤ 1 0 2 2 ≤ K ≤ N ≤ 10^2 2KN102
对于 40% 的数据, 2 ≤ K ≤ N ≤ 1 0 4 2 ≤ K ≤ N ≤ 10^4 2KN104
对于 100% 的数据, 2 ≤ K ≤ N ≤ 1 0 5 , 1 ≤ u , v , A i ≤ N , 1 ≤ t ≤ 1 0 5 2 ≤ K ≤ N ≤ 10^5,1 ≤ u, v, A_i ≤ N,1 ≤ t ≤ 10^5 2KN1051u,v,AiN1t105。保证 A i A_i Ai 两两不同。

解题思路:
n个节点n-1条边,景区一定是一个树形结构,景点之间不存在环路,所以只需要记录上一个节点,保证不走回头路就可以实现DFS

代码示例:

from sys import setrecursionlimit
setrecursionlimit(100010)
def dfs(start,end,cur,pre,totalCost):global lengthglobal uglobal vglobal tif cur == end:return totalCost# 用for循环遍历邻接节点for i in range(length):if v[i] == pre:continueif u[i] == cur:temp = dfs(start,end,v[i],cur,totalCost+t[i])if temp > 0:return tempreturn 0n,k = map(int,input().split())
u = []
v = []
t = []
for i in range(n-1):u1,v1,t1 = map(int,input().split())u.append(u1)v.append(v1)t.append(t1)u.append(v1)v.append(u1)t.append(t1)
length = (n-1)*2 # 邻接三元组的长度
path = [int(i) for i in input().split()]
# 算出总代价
s = 0
temp = [0]*(k-1)
for i in range(1,k):temp[i-1] = dfs(path[i-1],path[i],path[i-1],-1,0)s += temp[i-1]
print(s-temp[0],end = ' ')
# 中间部分
for i in range(1,k-1):print(s-temp[i-1]-temp[i]+dfs(path[i-1],path[i+1],path[i-1],-1,0),end = ' ')
print(s-temp[k-2],end = ' ')

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vs右键在浏览器中查看报错

vs右键在浏览器中查看报错Visual studio 右键在浏览器中查看报错HTTP错误500.30——ANCM进程内启动失败——.NET Core HTTP Error 500.30 - ANCM In-Process Start Failure - .NET Core HTTP Error 500.30 - ANCM In-Process Start Failure Common solutions to this issue: …

海量电动汽车数据无法解决?不放试试基于MonteCarlo方法的大规模电动汽车充放电模型程序代码!

前言 电动汽车大规模入网充电时会导致系统内负载峰值拔高的问题&#xff0c;和分布式电源一样&#xff0c;都会对电网的安全稳定运行造成冲击&#xff0c;需要在满足系统运行经济效益最优的同时&#xff0c;尽量降低大量电动汽车入网无序充电对系统造成的不良影响。通过分析电…

【WEEK5】 【DAY4】数据库操作【中文版】

2024.3.28 Thursday 目录 2.数据库操作2.1.数据库2.1.1.新建数据库&#xff08;右键的方法&#xff09;2.1.2.查询&#xff1a;点击“查询”->“新建查询表”即可输入所需要的语句&#xff0c;点击“运行”&#xff0c;如&#xff1a; 2.2.结构化查询语句分类2.3.数据库操作…

帝国cms自适应html5古诗词历史名句书籍文章资讯网站源码整站模板sinfo插件带采集会员中心

(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买!购买本专栏住如有什么源码需要,可向博主私信,第二天即可发布!博主有几万资源) 帝国cms自适应html5古诗词名句书籍文…

<TensorFlow学习使用P1>——《TensorFlow教程》

一、TensorFlow概述 前言&#xff1a; 本文中一些TensorFlow综合案例的代码逻辑一般正常&#xff0c;在本地均可运行。如有代码复现运行失败&#xff0c;原因如下&#xff1a; &#xff08;1&#xff09;运行环境配置可能有误。 &#xff08;2&#xff09;由于一些数据集存储空…

Kubernetes operator系列:Cue语言基础学习

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes operator学习 系列文章&#xff0c;本节会对 Cue配置语言 进行学习&#xff0c;Cue是一门为配置而生的语言&#xff0c;在开源项目kubevela中被广泛使用 本文的所有代码&#xff0c;都存储于github代…

电脑ip地址如何改?这些修改方法请收好!

在数字化日益深入的今天&#xff0c;电脑作为我们日常工作和生活中的重要工具&#xff0c;其网络功能显得尤为关键。而在网络世界中&#xff0c;IP地址则是电脑连接互联网的身份证&#xff0c;它标识着电脑在网络中的位置与身份。然而&#xff0c;在某些特定情境下&#xff0c;…

头歌 实验一 关系数据库标准语言SQL湖北汽车工业学院 )

头歌 实验一 关系数据库标准语言SQL 制作不易&#xff01;点个关注呗&#xff01;为大家创造更多的价值&#xff01; 目录 头歌 实验一 关系数据库标准语言SQL**制作不易&#xff01;点个关注呗&#xff01;为大家创造更多的价值&#xff01;** 第一关&#xff1a;创建数据库第…

C语言: 指针讲解

为什么需要指针? &#xff08;1&#xff09;指针的使用使得不同区域的代码可以轻易的共享内存数据。当然你也可以通过数据的复制达到相同的效果&#xff0c;但是这样往往效率不太好&#xff0c;因为诸如结构体等大型数据&#xff0c;占用的字节数多&#xff0c;复制很消耗性能…

LTE 信道的分配

**部分笔记** 逻辑信道 数据在下行的经过RLC层处理后&#xff0c;会根据数据的类型进行不同的逻辑信道&#xff08;数据类型的不听&#xff0c;用户的不同&#xff09; 传输信道 在逻辑信道达到MAC层后&#xff0c;会被分配到 物理信道 逻辑信道 按照内容的属性以及UE的不…

C++经典面试题目(五)

1、类的成员变量和成员函数有什么区别&#xff1f; 成员变量是类中存储数据的成员&#xff0c;描述了类的状态。成员函数是类中定义的操作数据的函数&#xff0c;用于实现类的行为。成员变量存储对象的状态信息&#xff0c;而成员函数用于操作和访问这些状态信息。 2、什么是…

智算AI平台介绍:初识volcano

提到智算AI平台&#xff0c;肯定离不了Volcano&#xff0c;Volcano与Kubernetes天然兼容&#xff0c;并为高性能计算而生。 一.volcano是什么 Volcano是CNCF 下首个也是唯一的基于Kubernetes的容器批量计算平台&#xff0c;主要用于高性能计算场景。 它提供了Kubernetes目前…

【Java常用的API】JDK8相关时间类

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

Linux中的常见的几种安装软件的方式

使用包管理器安装&#xff1a; 在大多数常见的 Linux 发行版中&#xff0c;都提供了包管理器来方便地安装、更新和管理软件包。以下是一些常见的包管理器及其相应的安装命令&#xff1a; apt-get / apt&#xff1a; Debian、Ubuntu 及其衍生版本使用的包管理器&#xff0c;可以…

第十三届蓝桥杯JavaA组省赛真题 - 裁纸刀

解题思路&#xff1a; 一道简单的数学题 先看例子&#xff0c;边缘必须裁四次&#xff0c;然后得到两行三列共六张二维码。 横线5裁一次&#xff0c;竖线6 7 8 9各裁一次&#xff0c;加上裁边缘的四次&#xff0c;共九次。 也就是说&#xff0c;横向裁剪次数为【行数 - 1】…

数独——拥有一定难度的回溯练习题,值得一看

数独相信大家都玩过&#xff0c;也都拥有不同的策略&#xff0c;那么放到C中又是怎样的呢&#xff1f;其实它就是回溯算法。话不多说&#xff0c;直接用例题来讲解&#xff1a; Description 数独是根据99盘面上的已知数字&#xff0c;推理出所有剩余空格的数字&#xff0c;并…

python常用的语法

Python是一种高级、通用、解释型的编程语言&#xff0c;具有简洁、易于阅读和理解的语法。以下是Python中常用的语法&#xff1a; 变量定义和赋值&#xff1a; variable value输出内容&#xff1a; print("Hello, World!")条件判断&#xff1a; if condition:# 条件…

52 vue 中 image 资源直接使用 路径 和 使用require 的差异

前言 这也是 最近碰到的一个比较有趣的问题 是在 http 请求较多的场景下触发的情况 一般 我们的 Vue 中使用图片的地方, 一般会使用 require(“$imgPath”) 或者 “/$imgPath” 来配置图片的资源 然后 这个在目标页面 http 请求比较多的情况下, 两者 会有一些 差异, 我们…

(学习日记)2024.03.26:UCOSIII第二十三节:系统启动流程概览(持续更新)

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

Android中运动事件的处理

1.目录 目录 1.目录 2.前言 3.程序演示 4.第二种程序示例 5.扩展 2.前言 触摸屏&#xff08;TouchScreen&#xff09;和滚动球&#xff08;TrackBall&#xff09;是 Android 中除了键盘之外的主要输入设备。如果需要使用触摸屏和滚动球&#xff0c;主要可以通过使用运动事…