![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
深度优先搜索
文章平均质量分 50
宁皇说java
大专文学专业在读,干过工地和外卖,觉得还是编程香,目前研究方向:分布式微服务,检索引擎,数据仓库
展开
-
leetcode-反转字符串
思路:● 明确递归函数的意义:当前第i,j个字符是否与字符串中第k个字符相同● 回溯的终止条件有:1. 越界,2.找到最后一个单词,3.当前搜索的单词不等于字符串中的某个的单词● 注意向各个方向深搜只是更改下一层的位置信息,将最后的结果都或起来,只要在一个方向满足就代表,在当前位置能找到下一个位置的坐标● 注意防止重复遍历,要将当前位置的字符进行标记,在搜索后也要进行回溯class Solution { public boolean exist(char[][] board, .原创 2022-03-31 10:42:03 · 328 阅读 · 0 评论 -
蓝桥杯训练营—2n皇后问题(java)(递归回溯)
问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。输入格式 输入的第一行为一个整数n,表示棋盘的大小。 接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。 输出格式 输出一个整数,表示总共有多少种放法。样例输入41 .原创 2022-01-11 08:18:19 · 328 阅读 · 0 评论 -
蓝桥训练营-路径之谜-java(深搜)
题目题目描述 小明冒充X星球的骑士,进入了一个奇怪的城堡。 城堡里边什么都没有,只有方形石头铺成的地面。假设城堡地面是 n x n 个方格。【如图1.png】所示。按习俗,骑士要从西北角走到东南角。 可以横向或纵向移动,但不能斜着走,也不能跳跃。 每走到一个新方格,就要向正北方和正西方各射一箭。(城堡的西墙和北墙内各有 n 个靶子)同一个方格只允许经过一次。但不必做完所有的方格。如果只给出靶子上箭的数目,你能推断出骑士的行走路线吗?有时是可以的,比如图1.png中的例子。本题的要求就是已知原创 2022-01-11 07:47:53 · 145 阅读 · 0 评论 -
三升序列的个数
题目思路分别向两个方向深搜代码package 力扣测试;import java.util.Scanner;public class Test { public static void main(String[] args) { int ans = 0; char[][] chs = new char[30][50]; int[][] changedir = { { 0, 1 }, { 1, 0 }, { 1, 1 }, { 1, -原创 2021-11-23 22:41:04 · 74 阅读 · 0 评论 -
leetcode375. 猜数字大小 II (区间dp)
题目思路:-----分析:猜数字的过程中需满足确保获胜且最小现金无论猜那个数都得满足1. 中的条件,于是不能使用二分,我们必须对所有情况进行决策确定最优子结构:当只有两个数时,选取两个数都可确保获胜,但选小的那个,能满足最小现金将最优子结构状态转移至全局,在1~n中选取一个数,两边都得是最优子结构,再在子结构中选取最优解确定状态转移方程dp[i][j]=Math.min(dp[i][j],k+Math.max(dp[i][k-1],dp[k+1][j]));-----注意:通过原创 2021-11-22 08:54:49 · 291 阅读 · 0 评论 -
leetcode547. 省份数量(DFS)
题目思路每个身份之间都是连通的我们可以使用深搜对一次连通的省份做标记,深搜结束省份加一再次深搜第一个临界节点,每次深搜都要判断该节点是否已经被访问注意:不要将hash思想限制在两列,hash映射可以映射多列数据如果当前数是最大于(不等于)最大值,直接返回长度,等于的情况再取最小值代码:class Solution { //行和列相同 int row; int col; int num; boolean[] visit; public原创 2021-11-22 08:54:02 · 89 阅读 · 0 评论 -
八皇后问题-回溯经典
八皇后问题题目代码实现题目要在8*8的国际象棋棋盘中放8个皇后,使任意两个皇后都不能互相吃掉。规则是皇后能吃掉同一行、同一列、同一对角线的棋子。下图是符合摆放的一种情况开始的思路是二维深搜,果然超时不行,没有注意题目特点,明显的回溯递归(相邻两层互不相同,相互影响)理解回溯算法中对每层的操作即可,题意要求相邻两个皇后,不能在同一层,则可等价于在每层递归填一个数即可,递归树的宽度为8。我们设层数为x,则在该层有皇后对应的列为arr[x],就实现了二维简化为一维(不同行交给递归处理)判断条件是否原创 2021-04-25 17:36:18 · 247 阅读 · 0 评论 -
数独java(二维深搜)
题目你一定听说过“数独”游戏。如【图1.png】,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。数独的答案都是唯一的,所以,多个解也称为无解。本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。格式要求,输入9行,每行9个字符,0代表未知,其它数字为已知原创 2021-04-13 21:41:04 · 153 阅读 · 3 评论 -
经典深搜易错(7数排列)
一、问题描述今有7对数字:两个1,两个2,两个3,…两个7,把它们排成一行。要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列:17126425374635当然,如果把它倒过来,也是符合要求的。请你找出另一种符合要求的排列法,并且这个排列法是以74开头的。思路:(难度在于将排列问题转变为深搜填数问题)第一思路就是深搜,找到这个排列,再依次判断是不是符合排列,但对于深搜14个数复杂度实在太高,所以我应该将深搜的思路转化为填数的思路原创 2021-04-13 17:02:10 · 242 阅读 · 0 评论 -
三元组中心Java_模拟
问题描述 在数列 a[1], a[2], …, a[n] 中,如果对于下标 i, j, k 满足 0<i<j<k<n+1 且 a[i]<a[j]<a[k],则称 a[i], a[j], a[k] 为一组递增三元组,a[j]为递增三元组的中心。 给定一个数列,请问数列中有多少个元素可能是递增三元组的中心。输入格式 输入的第一行包含一个整数 n。 第二行包含 n 个整数 a[1], a[2], …, a[n],相邻的整数间用空格分隔,表示给定的数列。输出格原创 2021-04-07 22:43:44 · 128 阅读 · 0 评论 -
(蓝桥)平方拆分
平方拆分问题描述:思路代码附上特别提醒问题描述:将 2019 拆分为若干个两两不同的完全平方数之和,一共有多少种不同的方法?注意交换顺序视为同一种方法,例如 13平方 + 25平方 + 35平方 = 2019 与 132 + 352 +252 = 2019 视为同一种方法。【答案提交】这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。思路在1~根号2019之间搜索数,并进行组合问题,明显使用DFS深搜算法确定深原创 2021-03-15 21:18:36 · 398 阅读 · 1 评论 -
(蓝桥)纸牌三角形 全排列(回溯)
纸牌三角形题目描述思路分析代码贴上注意事项题目描述A,2,3,4,5,6,7,8,9 共9张纸牌排成一个正三角形(A按1计算)。要求每个边的和相等。下图就是一种排法(如有对齐问题,参看p1.png)。 A 9 6 4 8 3 7 5 2这样的排法可能会有很多。如果考虑旋转、镜像后相同的算同一种,一共有多少种不同的排法呢?请你计算并提交该数字。 答案:144注意:需要提交的是一个整数,不要提交任何多余内容。思路分析分析:此类组合问题原创 2021-03-13 21:24:00 · 173 阅读 · 0 评论 -
子串分值(蓝桥)
子串分值题目描述思路分析代码实现题目描述【问题描述】对于一个字符串 S,我们定义 S 的分值 f(S) 为 S 中出现的不同的字符个 数。例如 f(”aba”) =2,f(”abc”) = 3, f(”aaa”) = 1。现在给定一个字符串 S[0…n−1](长度为 n),请你计算对于所有 S的非空 子串 S[i…j](0≤i≤ j < n),f(S[i…j]) 的和是多少。【输入格式】输入一行包含一个由小写字母组成的字符串 S。【输出格式】输出一个整数表示答案。【样例输入】a原创 2021-03-11 21:04:56 · 1264 阅读 · 2 评论 -
剪邮票
剪邮票题目描述思路代码题目描述剪邮票如【图1.jpg】, 有12张连在一起的12生肖的邮票。现在你要从中剪下5张来,要求必须是连着的。(仅仅连接一个角不算相连)比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。请你计算,一共有多少种不同的剪取方法。请填写表示方案数目的整数。注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。思路这题还是有一定难度的,解决此类问题,一般涉及到数学坐标分析的功底,乍一看我们能想到使用深搜,搜出5个满足连通的方格,存入原创 2021-04-03 09:48:20 · 104 阅读 · 0 评论 -
方格填数(java)
题目如下的10个格子 +--+--+--+ | | | |+--+--+--+--+| | | | |+--+--+--+--+| | | |+--+--+--+(如果显示有问题,也可以参看【图1.jpg】)填入0~9的数字。要求:连续的两个数字不能相邻。(左右、上下、对角都算相邻)一共有多少种可能的填数方案?请填写表示方案数目的整数。注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。思路分析一开始想到是深搜,但是是填空题应该没有原创 2021-04-01 20:07:03 · 409 阅读 · 0 评论 -
Java凑算式
凑算式题目思路代码题目凑算式 B DEFA + --- + ------- = 10 C GHI (如果显示有问题,可以参见【图1.jpg】)这个算式中A到I代表1~9的数字,不同的字母代表不同的数字。比如:6+8/3+952/714 就是一种解法,5+3/1+972/486 是另一种解法。这个算式一共有多少种解法?注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。思路乍一看简单的,直接深搜回溯就行了,但是结果出来得0,调原创 2021-03-31 21:46:52 · 302 阅读 · 2 评论 -
回溯法(三羊献瑞)
这里写目录标题前沿(浅谈回溯)回溯法模板例题理解(三羊献瑞)图解过程前沿(浅谈回溯)回溯法在计算机解题过程中应用广泛,回溯法,一般可以解决如下几种问题:组合问题:N个数里面按一定规则找出k个数的集合排列问题:N个数按一定规则全排列,有几种排列方式切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集棋盘问题:N皇后,解数独等等如何理解回溯法回溯法解决的问题都可以抽象为树形结构因为回溯法解决的都是在集合中递归查找子集,「集合的大小就构成了树的宽度原创 2021-02-17 13:17:59 · 418 阅读 · 1 评论 -
深度优先搜索(DFS)1/31
图的深度优先搜索(Depth First Search) 。个人观点:该算法类似于树的先序查找,理解好树的先序查找更容易理解,难度一般,关键是学会图解,理解回溯递归过程。1)深度优先遍历,从初始访问结点出发,初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接结点, 可以这样理解:每次都在访问完当前结点后首先访问当前结点的第一个邻接结点。2)我们可以看到,这样的访问策略是优先往纵向挖掘深入,而不是对一个结点的所有邻接原创 2021-01-31 23:11:00 · 143 阅读 · 0 评论 -
BFS迷宫问题
BFS迷宫问题题目描述思路分析BFS的理解代码贴上注意事项题目描述题目:下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可以通行的地方。010000000100001001110000迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这个它的上、下、左、右四个方向之一。对于上面的迷宫,从入口开始,可以按DRRURRDDDR 的顺序通过迷宫,一共 10 步。其中 D、U、L、R 分别表示向下、向上、向左、向右走。对于下面这个更复杂的迷宫(30 行 5原创 2021-03-20 21:28:43 · 380 阅读 · 0 评论 -
连通性检测dfs
对于一个邻接矩阵表示的图而言,判断是否存在多个连通的“1”存在dfs实现连通,将节点沿四周搜索,并记忆化值为1的节点为0,若深搜完成还有“1”的节点则不联通(对于所有1而言)public class test{ public static void main(String[] args) { int[][] arr = {{0, 1, 0}, {1, 0, 1}, {0, 1, 0}}; int cut = 0; for (int[] ints :原创 2021-04-07 07:42:40 · 366 阅读 · 0 评论