python 基础知识点(蓝桥杯python科目个人复习计划37)

今日复习内容:DFS--回溯

1.介绍

回溯:就是DFS是一种,在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。

回溯更强调:此路不通,另寻他路,走过的路需要打标记。

回溯法一般在DFS是基础上加上一些剪枝策略

2.个人理解

我理解的回溯,可以用来求排列

排列要求数字不重复,每次选择的数字都需要打标记,记为vis数组

哟输出当前排列,用于记录路径,记为path数组

简单来说,回溯就是先打标记,记录路径,然后下一层,回到上一层,再清除标记的过程。

我现在把它转化成代码:

def dfs(depth):# 当前为第depth个数字,0到depth - 1已经设置好if depth == n:print(path)return# 枚举第depth个数字for i in range(1,n + 1):# 数字i必须之前没有选择过if vis[i] is False:# 标记当前状态vis[i] = True# 记录当前路径path.append(i)# 进行下一轮搜索dfs(depth + 1)# 清空标记vis[i] = Falsepath.pop(-1)n = int(input('输入一个整数:'))
path = []
vis = [False] * (n + 1)
dfs(0)

运行结果:

回溯还可以用来求子集

给定n个数字,求子集:(我把它写成代码)

# 和买瓜那个题的思路差不多一样
n = int(input("请输入一个数字:"))
a = list(map(int,input().split()))
path = []
def dfs(depth):if depth == n:print(path)return# 该数字被选择的情况下path.append(a[depth])dfs(depth + 1)path.pop(-1)# 若是不选dfs(depth + 1)dfs(0)

运行结果:

例题1:N皇后

题目描述:

在N * N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意两个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框呈45度角的斜线上) ,你的任务是:对于给定的N,求出有多少种合法的放置方式。

输入描述:

输入中有一个正整数N <= 10,表示棋盘和皇后的数量。

输出描述:

为一个正整数,表示对应输入行的皇后的不同放置数量。

思路:

dfs枚举每一行放置的列;

标记的内容有:每列只能放一个,主对角线:x + y     副对角线:x - y + n

参考答案:

def dfs(depth):if depth == n:global ansans += 1return# 枚举第depth行放在哪列for i in range(1,n + 1):# 坐标为(depth,i)# 第i列先前未选择,主对角线,副对角线都未选择if vis1[i] is False and vis2[depth + i] is False and vis3[depth - i + n] is False:# 标记当前状态vis1[i] = Truevis2[depth + i] = Truevis3[depth - i + n] = Truedfs(depth + 1)# 清除标记vis1[i] = Falsevis2[depth + i] = Falsevis3[depth - i + n] = Falsen = int(input('请输入一个整数:'))
ans = 0
vis1 = [False] * (n  + 1)
vis2 = [False] * (2 * n + 1)
vis3 = [False] * (2 * n + 1)
dfs(0)
print(ans)

运行结果:

例题2:小朋友崇拜圈

题目描述:

班里N个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己)。

在一个游戏中,需要小朋友坐一个圈,每个小朋友都有自己最崇拜的小朋友在他的右手边。

求满足条件的圈最大多少人?

小朋友编号1,2,3...N

输入描述:

输入第一行,一个整数N(3 < N < 10^5)

接下来一行N个整数,空格分开。

输出描述:

要求输出一个整数,表示满足条件的最大圈的人数。

思路:

depth(x,length):走到x,已经走了length步

参考答案:

import sys
sys.setrecursionlimit(100000)
def dfs(x,length):# print(x,length)# 记录当前x,已经走了length步vis[x] = length# 如果下一步已经走过,则说明当前已经形成了一个圈if vis[a[x]]:# 更新最大圈global ansans = max(ans,length - vis[a[x] + 1])# 接着走下一步else:dfs(a[x],length + 1)n = int(input('请输入一个整数:'))
a = list(map(int,input().split()))
a = [0] + a
vis = [0] * (n + 1)
ans = 0
for i in range(1,n + 1):if vis[i] == 0:dfs(i,1)
print(ans)

OK,这篇就写到这里 ,下次继续!

ok,这篇就写到这里,下一篇继续!

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

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

相关文章

计算机毕业设计SSM基于的奶茶店预约订单系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; vue mybatis Maven mysql5.7或8.0等等组成&#xff0c;B…

手把手教你开发Python桌面应用-PyQt6图书管理系统-图书信息表格数据显示及搜索实现

锋哥原创的PyQt6图书管理系统视频教程&#xff1a; PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

钓鱼邮件便捷发送工具(GUI)

简介 本程序利用Python语言编写&#xff0c;使用Tkinter实现图形化界面&#xff0c;可使用Pyinstaller进行exe打包&#xff0c;程序主界面截图如下&#xff1a; 功能 支持腾讯企业邮、网易企业邮、阿里企业邮、自建邮服SMTP授权账号&#xff08;其他邮服&#xff0c;可在自建…

leetcode(二分查找)35.搜索插入位置(C++详细解释)DAY6)

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。…

hook函数——useRef

useRef useRef 是一个 React Hook&#xff0c;它能帮助引用一个不需要渲染的值。也就是说useRef可以存储一个值&#xff0c;但是不被组件渲染&#xff0c;仅仅只是引用&#xff0c;主要包括两个方面&#xff0c;例如使用ref引用一个值&#xff0c;使用ref引用一个dom节点&…

国产光耦2024:发展机遇与挑战全面解析

随着科技的不断进步&#xff0c;国产光耦在2024年正面临着前所未有的机遇与挑战。本文将深入分析国产光耦行业的发展现状&#xff0c;揭示其在技术创新、市场需求等方面的机遇和挑战。 国产光耦技术创新的机遇&#xff1a; 国产光耦作为光电器件的重要组成部分&#xff0c;其技…

知识价值2-什么是IDE?新手用哪个IDE比较好?

IDE是集成开发环境&#xff08;Integrated Development Environment&#xff09;的缩写&#xff0c;是一种软件应用程序&#xff0c;旨在提供集成的工具集&#xff0c;以方便开发人员进行软件开发。IDE通常包括代码编辑器、编译器、调试器和其他工具&#xff0c;以支持软件开发…

OpenCV-35 查找轮廓

一、 什么是图像轮廓 图像轮廓是具有相同颜色或灰度的连续点的曲线&#xff0c;轮廓在形状分析和物体的检测识别中很有用。 用于图形分析物体的识别和检测 注意点&#xff1a; 为了检测的准确性&#xff0c;需要先对图像进行二值化或Canny操作。画轮廓时会修改输入的图像&a…

01-Spring实现重试和降级机制

主要用于在模块调用中&#xff0c;出现失败、异常情况下&#xff0c;仍需要进行重复调用。并且在最终调用失败时&#xff0c;可以采用降级措施&#xff0c;返回一般结果。 1、重试机制 我们采用spring 提供的retry 插件&#xff0c;其原理采用aop机制&#xff0c;所以需要额外…

架构(十二)动态Excel

一、引言 作者最近的平台项目需要生成excel&#xff0c;excel的导入导出是常用的功能&#xff0c;但是作者想做成动态的&#xff0c;不要固定模板&#xff0c;那就看看怎么实现。 二、后端 先捋一下原理&#xff0c;前后端的交互看起来是制定好的接口&#xff0c;其实根本上是…

【数据结构和算法】--- 基于c语言排序算法的实现(2)

目录 一、交换排序1.1 冒泡排序1.2 快速排序1.2.1 hoare法1.2.2 挖坑法1.2.3 前后指针法 1.3 快速排序优化1.3.1 三数取中法选key1.3.2 递归到小的子区间使用插入排序 1.4 快排非递归版 二、归并排序2.1 归并排序2.1.1 递归版2.1.2 非递归版 一、交换排序 基本思想&#xff1a…

【java】Hibernate访问数据库

一、Hibernate访问数据库案例 Hibernate 是一个在 Java 社区广泛使用的对象关系映射&#xff08;ORM&#xff09;工具。它简化了 Java 应用程序中数据库操作的复杂性&#xff0c;并提供了一个框架&#xff0c;用于将对象模型数据映射到传统的关系型数据库。下面是一个简单的使…