![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DFS
dfs题型
Py_Heee
全国大学生it技能大赛决赛三等奖,蓝桥杯省一等奖,电子设计大赛省二等奖,中国机器人及人工智能大赛省三等奖。目前学习涉及领域有机械臂,机器视觉,程序设计。
展开
-
【DFS剪枝】
对于求最优解的一类问题,通常可以用最优性剪枝,比如在求解迷宫最短路的时候,如果发现当前的步数已经超过了当前最优解,那从当前状态开始的搜索都是多余的,因为这样搜索下去永远都搜不到更优的解。如果搜索方法是每次从剩下的数里选一个数,一共搜到第k层,那么1,2,3这个选取方法能被搜索到6次,这是没必要的,因为我们只关注选出来的数的和,而根本不会关注选出来的数的顺序,所以这里可以用重复性剪枝。此外,在搜索是否有可行解的过程中,一旦找到了一组可行解,后面所有的搜索都不必再进行了,这算是最优性剪枝的一个特例。原创 2022-10-18 16:12:31 · 1057 阅读 · 0 评论 -
【DFS题型三/求最小数值】葱头君开公司
每天,蒜头君都要分配 N 项工作给他的员工,但是,由于能力的不同,每个人对处理相同工作所需要的时间有快有慢。众所周知,蒜头君是一个非常重视效率的人,他想知道该如何分配工作,才能使得完成所有工作的时间总和最小(每个员工只可以被分配到一个工作)。但是我们也都知道蒜头君不是一般的懒,所以蒜头君找到了你,请你拯救一下蒜头君吧!task[N][N],task[i][j] 指的是第 i 项工作如果由 j 号员工完成所需要的时间。第一行输入一个整数 N,代表有 N 个员工,员工编号从 1 到 N。原创 2022-10-15 16:28:25 · 117 阅读 · 0 评论 -
【DFS题型九/双向DFS】王子救公主
问在这个迷宫中,蒜头君是否可以救出公主(蒜头君和公主相遇后,就能背着公主逃出迷宫了)。一天,蒜头君梦见自己当上了王子,但是不幸的是,自己的公主被可恶的巫婆抓走了。’.‘表示可以通行的路,’#'表示迷宫的墙,'w’表示王子开始所在的位置,'g’表示公主开始所在的位置。标记vis建立为三维,一维存王子(d=0),一维存公主(d=1),(回溯时不将vis清零)若存在重合点就说明可以相遇。当d=1时,步长为2-d也就是1,为公主。输出王子是不可以救出自己的公主,如果能救出则输出"yes",否则输出"no"。原创 2022-10-15 16:13:59 · 242 阅读 · 0 评论 -
【DFS题型八/树状图】家谱
这一天蒜头君拿到了自己家的家谱,蒜头君便想知道,在自己家的家谱中,每位祖先有多少直系后代(直系后代包括他的孩子和他孩子的直系后代)。但是家族历史源远流长,家谱实在太庞大了,自己一个人完全数不过来。热心的你便自告奋勇帮蒜头君写一个程序,来统计每位祖先有多少直系后代。接下来读入 n−1 行,每行有两个整数 x(1≤x≤n), y(1≤y≤n),表示 x 是 y 的父母。输入的第一行有一个整数 n(1≤n≤100000),表示家谱中的总人数。输出 n 行,每行有一个整数,表示第 i 个人有多少个直系后代。原创 2022-10-15 14:11:44 · 153 阅读 · 0 评论 -
【DFS题型七/连通块】最大岛屿
这一天蒜头君生日,他的朋友们一起来给蒜头君买一个大的蛋糕过生日。游戏做完后到了切蛋糕的时刻了,朋友们知道蒜头君喜欢吃蛋糕,便让蒜头君自己给自己切一块最大的。第一行输入两个被空格隔开的整数 R(1 \le R \le 1000)R(1≤R≤1000) 和 C(1 \le C \le 1000)C(1≤C≤1000)。蒜头君把这些水果分为两类,一类是自己喜欢吃的水果,用’#‘来表示;一类是自己不喜欢吃的水果,用’.'来表示。输出一个整数,表示蒜头君可以吃到的蛋糕最大是多少(即对应到网格中的格子数)。原创 2022-10-15 12:36:15 · 92 阅读 · 0 评论 -
【DFS题型七/连通块】岛屿数量
【代码】【BFS】岛屿数量。原创 2022-09-14 19:43:08 · 138 阅读 · 0 评论 -
【DFS题型七/连通块】P1451 求细胞数量
题目描述一矩形阵列由数字00到99组成,数字11到99代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。输入格式第一行两个整数代表矩阵大小nn和mm。接下来nn行,每行一个长度为mm的只含字符0到9的字符串,代表这个n \times mn×m的矩阵。输出格式一行一个整数代表细胞个数。输入输出样例输入 #1复制4 100234500067103456050020456006710...原创 2022-05-01 20:03:15 · 169 阅读 · 0 评论 -
【DFS题型六/反向DFS】作物杂交
【代码】【DFS题型六/反向DFS】作物杂交。原创 2022-10-06 16:14:52 · 318 阅读 · 0 评论 -
【DFS题型五/最短路】迷宫
【代码】【DFS题型五/最短路】原创 2022-10-15 12:15:51 · 129 阅读 · 0 评论 -
【抽象DFS】
在第一层dfs的时候,我们可以枚举是否选第一个数,如果选第一个数则让S加上第一个数且k加一,dfs进入到下一层;在第二层,对第二个数做同样的处理, dfs的过程中记录已经选取的数的个数,如果已经选取了k个数,判断S值是否等于sum。下图是这个搜索过程对应的 搜索树,搜索树上的每一个结点都是一个状态,一个状态包含两个值S和k,也就是一个状态对应当前的数值总和,以及选的数的个数。前面说过, dfs看起来是运行在图上的搜索算法,而前一节给大家展示的dfs过程,我们没有看到图的存在,这就是抽象形式的dfs的特点。原创 2022-10-16 10:33:41 · 772 阅读 · 0 评论 -
【抽象DFS/四维坐标/全局变量/最大值】八皇后/改
需要注意的是左斜和右斜在同一行都可以用x,y的代数和来判断,同一左斜↗的棋子 i+j是一个定值,同一右斜↘的棋子 i-j是一个定值,不过会出现负数,所以整体加个n防止出现负数索引。因为python速度太慢了,需要剪枝,但目前并不知道如何剪枝,因为样例比较少,故可以用打表法,选择将n=12,n=13得到答案在打印出来。通过这样来查询四个方向是否有其他的棋子存在。原创 2022-10-06 10:15:55 · 189 阅读 · 0 评论 -
【DFS题型二/所有路径/全局变量】迷宫
【代码】【DFS题型二/二维坐标/全局变量】迷宫。原创 2022-10-05 16:25:52 · 147 阅读 · 0 评论 -
【DFS题型一/递归/数字全排序】递归实现枚举
【代码】【DFS题型一/递归/数字全排序】递归实现排列型枚举。原创 2022-10-06 08:20:07 · 143 阅读 · 0 评论 -
[DFS和的全排列]
def dfs(step): global total if step==10: if a[1]*100+a[2]*10+a[3]+a[4]*100+a[5]*10+a[6]==a[7]*100+a[8]*10+a[9]: total+=1 print("%d%d%d+%d%d%d=%d%d%d"%(a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9])) return...原创 2022-05-06 18:22:03 · 183 阅读 · 0 评论 -
[DFS全排列]深入理解dfs的内外层
#找出begin到n中和为m的所有组合,存入path并且打印。从前到后的深搜顺序保证了输出是符合字典顺序的。def dfs(begin,sum,path): if sum==0: for i in range(len(path)): if i==len(path)-1: print(path[i],end='=') print(m) else: ...原创 2022-05-06 14:53:50 · 661 阅读 · 0 评论