深度优先搜索

DFS求岛的个数LeetCode 200. Number of Islands

会有一股神秘感。 提交于 2020-04-07 07:36:07
深度优先搜索算法(Depth-First-Search),是搜索算法的一种。它沿着树的深度遍历树的节点,尽可能深的搜索树的分 支。当节点v 的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。DFS属于盲目搜索。 算法步骤: 1. 访问顶点v; 2. 依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问; 3. 若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止 200. Number of Islands Descriptor:Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by

【算法研究】搜索算法-深度优先搜索

喜夏-厌秋 提交于 2020-04-07 02:13:59
如果您觉得本文有用,可以在微博上关注我,每周我都会在微博上发布新博客发表的通知, 我的微博 ###深度优先搜索 ####介绍 如果您觉得这篇文章排版不舒服,请到我的微盘下载pdf: 搜索算法-深度优先搜索 深度优先搜索是一种用来 遍历 或者 搜索 树(TREE)或图(GRAPH)结构的算法。搜索开始于某个根节点(从图中选取某个节点),然后在开始回溯前尽可能远地探索到这一支的终点。 对于DFS的实际应用程序来说,DFS常常因为要搜索的图的某一条搜索路径太长(甚至是无限的)而陷入性能瓶颈,所以我们经常制定DFS只能搜索到某个深度, 如果用一个图来代表深度优先搜索的过程,即如下图: ####深度优先遍历的伪码实现 相应的伪码实现在《算法导论》这本书中有讲解,书中用的方法十分巧妙,它用三种颜色来代表三种状态 WHITE代表未访问的结点 GRAY代表该节点第一次被访问 BLACK代表该节点的所有邻接节点都被访问,即回溯完毕的 第二次 访问 以下是一个深度优先遍历的递归实现: DFS(G, s) for 在图G中的每一个节点v status[v] = WHITE // 进行其他初始 DFS-VISIT(s) DFS-VISIT(v) status[v] = GRAY for 每一个v的邻接节点 if (status[v] == WHITE) DFS-VISIT(t) status[v] =

深度优先搜索(DFS)思路及算法分析

♀尐吖头ヾ 提交于 2020-04-03 04:30:58
1、算法用途 用于遍历图中的节点,有些 类似于 树的深度优先遍历 。这里唯一的问题是,与树不同,图形可能包含循环,因此我们可能会再次来到同一节点。 2、主要思想 借用一个邻接表和布尔类型数组(判断一个点是否查看过,用于避免重复到达同一个点,造成死循环等),先将所有点按一定次序存入邻接表,再通过迭代器,对邻接表的linklist和布尔数组做出操作,从而达到不重复递归遍历的效果。 (邻接表是表示了图中与每一个顶点相邻的边集的集合,这里的集合指的是无序集) 3、代码(java) (以上图为例的代码) 1 //深度优先搜索 2 import java.io.*; 3 import java.util.*; 4 5 //This class represents a directed graph using adjacency list 6 //representation 7 class Graph 8 { 9 private int V; // No. of vertices 10 11 // Array of lists for Adjacency List Representation 12 private LinkedList<Integer> adj[]; 13 14 // Constructor 15 Graph(int v) 16 { 17 V = v; 18 adj =

深度优先搜索

此生再无相见时 提交于 2020-03-30 16:33:17
深度优先搜索 【题目】类似一张宫格图,即迷宫,小明在迷宫中迷路了,好朋友苏格去寻找他,请你找出一条最短路径的步数。其中有障碍物,不能走。 输入要求:第一行输入两个整数n,m分别代表迷宫为n行m列,接下来n行分别输入m个数值,最后一行输入起点起点坐标(小华的坐标)和终点坐标(小明的坐标),输入0代表可以走,输入1代表障碍物; 输出要求:只输出最短步数 输入样例: 5 4 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1 4 3 输出样例: 7 代码如下: import java.util.Scanner; public class J解救小哈深搜代码 { static int n,m,sx,sy,zx,zy; static final int size=55; static int min=99999999; static int dir[][]= {{0,1},{1,0},{0,-1},{-1,0}}; static int map[][]=new int [size][size];//存放 static int vis[][]=new int [size][size];//标记是否走过 static Scanner in=new Scanner (System.in); public static boolean inmap(int x

DFS(深度优先搜索)

假如想象 提交于 2020-03-20 00:03:54
深度优先搜索算法(英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。(直到走不下去才往回走) 基本模板 1 int check(参数) 2 { 3 if(满足条件) 4 return 1; 5 return 0; 6 } 7 8 void dfs(int step) 9 { 10 判断边界 11 { 12 相应操作 13 } 14 尝试每一种可能 15 { 16 满足check条件 17 标记 18 继续下一步dfs(step+1) 19 恢复初始状态(回溯的时候要用到) 20 } 21 } 实例 1、全排列(字符串内元素的所有排列方法)(洛谷CF6A与此题类似) 1 //全排列问题 2 #include<stdio.h> 3 #include<string.h> 4 5 int n; 6 char a[15]; 7 char re[15]; 8 int vis[15]; 9 //假设有n个字符要排列,把他们依次放到n个箱子中 10 //先要检查箱子是否为空,手中还有什么字符,把他们放进并标记。 11

深度优先搜索的实现

梦想与她 提交于 2020-03-19 07:16:10
图的遍历是指从图中的某一个顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问一次且仅访问一次。注意到树是一种特殊的图,所以树的遍历实际上也可以看作是一种特殊的图的遍历。图的遍历主要有两种算法: 广度优先搜索 (Breadth-First-Search)和 深度优先搜索 (Depth-First-Search)。 一、深度优先搜索(DFS)的算法思想 深度优先搜索算法所遵循的搜索策略是尽可能“深”地搜索一个图。它的基本思想就是:首先访问图中某一起始顶点v,然后由v出发,访问与v邻接且未被访问的任一顶点w1,再访问与w1邻接且未被访问的任一顶点w2,……重复上述过程。当不能再继续向下访问时,依次退回到最近被访问的顶点,若它还有邻接顶点未被访问过,则从该点开始继续上述搜索过程,直到图中所有顶点均被访问过为止。 如上图所示,从顶点2开始深度优先遍历图,结果为:2,0,1,3。 二、DFS算法实现 和 广度优先搜索 一样,为了防止顶点被多次访问,需要使用一个访问标记数组visited[]来标记顶点是否已经被访问过。 这里使用邻接表表示图。对于一个 有向图 , 假设从给定顶点可以访问到图的所有其他顶点 ,则DFS递归算法的C++代码实现: /*************************************************************************

九数算式——深度优先搜索

空扰寡人 提交于 2020-03-03 01:00:58
/*标题:9数算式 观察如下的算式: 9213 x 85674 = 789314562 左边的乘数和被乘数正好用到了1~9的所有数字,每个1次。 而乘积恰好也是用到了1~9的所有数字,并且每个1次。 请你借助计算机的强大计算能力,找出满足如上要求的9数算式一共有多少个? 注意: 总数目包含题目给出的那个示例。 乘数和被乘数交换后作为同一方案来看待。 答案:1625 解题思路: 首先对九个数进行全排列,用到深度优先搜索(dfs),判断递归出口的条件; 其次对每种排列分割成两数相乘,利用数组循环; 最后判断结果是否满足题目的条件:用到了1~9的所有数字,满足则计数加一 public class NineNumber { //先定义1~9的字符数组 static char [ ] num = new char [ ] { '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' } ; //定义一个 访问数组,表示该元素是否被用过 static boolean [ ] vis = new boolean [ 9 ] ; //计数排列的个数 static int count = 0 ; //排列以字符串的形式输出 static String str = "" ; //访问数组元素初始化 public static void init ( int

迷宫生成及深度优先搜索遍历迷宫(OpenGL)

安稳与你 提交于 2020-03-02 06:43:32
  其实以前就写过一个迷宫的程序和DFS遍历,不过弄丢了,前几天闲就重写了一下。欢迎交流和拍砖。有很多不足的地方也希望大家多指正。   迷宫生成的算法来自《计算机图形学》,也就是这本书:   生成迷宫的算法描述如下:   由于表示墙使用了up_wall和left_wall两个矩阵,所以格子的数量要比能显示出来的多一行一列,否则屏幕最下边和最右边是没有墙的。虽然可以后面画上,不过我选择这样。   对于迷宫的遍历使用DFS,另外由于使用了一个visited矩阵表示每个格子是否已经访问过,所以即使迷宫里存在环也没有任何影响,不会死循环。      另外当时不知道glutPostRedisplay()这玩意儿,所以很蠢的把遍历的过程设成了DisplayFunc来看遍历的过程。   生成迷宫及DFS遍历的代码如下: 1 #include <iostream> 2 #include <fstream> 3 #include <stack> 4 #include <GL/gl.h> 5 #include <GL/glu.h> 6 #include <GL/glut.h> 7 #include <cstdlib> 8 using namespace std; 9 10 /*Constant And Structures*/ 11 const int SCREEN_WIDTH = 1200; 12

深度优先搜索及java实现

孤者浪人 提交于 2020-03-02 01:01:30
深度优先搜索是图里面一种基础的搜索算法,英文简写DFS(depth First Search),深度优先搜索采用的方式是“”耿直boy型恋爱方式”--不撞南墙不回头,本文采用的图如下图所示: 下面是DFS优先搜索的java实现,涉及到图Graph类、顶点Vertex类: import java.util.ArrayList; import java.util.List; //图类 public class Graph { //图中的顶点 private List<Vertex> vertexes; public Graph(int len){ //初始化时指定长度,避免扩容 vertexes = new ArrayList<>(len); } public void addVertex(Vertex v){ vertexes.add(v); } public List<Vertex> getVertexes() { return vertexes; } public void setVertexes(List<Vertex> vertexes) { this.vertexes = vertexes; } } import com.algorithm.graph.bfs.VertexColor; import lombok.Getter; import lombok.Setter;

DFS(深度优先搜索算法)入门理解和搜索路径详解

痴心易碎 提交于 2020-03-01 12:57:14
基本概念 深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。 搜索思想 深搜的思想就是一搜到底,而且已经搜索过的路径标记下来,不会重复搜索,如果一条路径的搜索不动了,那就退回,换一条路径搜索,知道所有的情况都搜索完。 基本模板 void dfs(int step) { 判断边界 尝试每一种可能 for(i=1;i<=n;i++) { 继续下一步 dfs(step+1) } 返回 } 搜索过程 深搜的思想就是一搜到底,如果搜索不动了,就退回换一条路径继续搜索,下面来看一个例子的搜索路径 例子的起始位置的(0,0),在一个九宫格内进行搜索。 #include<iostream> using namespace std; int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int book[3][3]={0}; int next[4][2]={0,1,1,0,0,-1,-1,0};//搜索顺序右下左上 int sum=0; void dfs(int x,int y,int step,string s) { if(step=