深度优先搜索(DFS)

定义:

(维基百科:https://en.wikipedia.org/wiki/Depth-first_search)

深度优先搜索算法(Depth-First-Search),是搜索算法的一种。是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止(属于盲目搜索)。

基本思想:

(1)访问顶点v;

(2)从v的未被访问的邻接点中选取一个顶点w,从w出发进行深度优先遍历;

(3)重复上述两步,直至图中所有和v有路径相通的顶点都被访问到。

算法复杂度:

若有v个顶点、E条边,则

用邻接表储存图,有O(V+E)

用邻接矩阵储存图,有O(V^2)

伪代码:

递归实现:

(1)访问顶点v;visited[v]=1;//算法执行前visited[n]=0

(2)w=顶点v的第一个邻接点;

(3)while(w存在)

if(w未被访问

从顶点w出发递归执行该算法;

w=顶点v的下一个邻接点;

//布尔型数组Visited[]初始化成false
void DFS(Vetex v)
{
    Visited[v] = true;
    for each w adjacent to v
        if (!Visited[w])
            DFS(w);
}

非递归实现:

(1)栈S初始化;visited[n]=0;

(2)访问顶点v;visited[v]=1;顶点v入栈S

(3)while(栈S非空)

x=栈S的顶元素(不出栈);

if(存在并找到未被访问的x的邻接点w)

访问w;visited[w]=1;

w进栈;

else

x出栈;

//布尔型数组Visited[]初始化成false
void DFS(Vertex v)
{
    Visited[v] = true;
    Stack  sta = MakeStack(MAX_SIZE);
    Push(sta, v);
    while (!Empty(sta))
    {
        Vertex w = Pop(sta);
        for each u adjacent to w
        {
            if (!Visited[u])
            {
                Push(sta, u);
                Visited[u] = true;
            }
        }
    }
}

附:用C语言写一个走迷宫

具体内容为:

1、输入长宽和迷宫地图(‘#’代表墙,‘.‘代表空地)

2、输入起点和终点坐标

3、用深度优先算法查找起点到终点的最短路径并显示出来

  1 #include <stdio.h>
  2
  3 char map[50][51];    //地图上限50*50
  4 int sign[50][50];     //标记
  5 int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
  6 int n,m;    //实际地图行数、列数
  7 int endy,endx;     //终点位置
  8 int min=99999999;
  9
 10 /* run this program using the console pauser or add your own getch, system("pause") or input loop */
 11
 12 //构造一个盏来记录走迷宫的路径
 13 struct Node
 14 {
 15     int y;
 16     int x;
 17 };
 18
 19 struct Stack
 20 {
 21     Node * pbase;
 22     int top;
 23 };
 24
 25 void StackInit(Stack * pstack){
 26     pstack->pbase=new Node[100];
 27     pstack->top=0;
 28 }
 29
 30 void StackPush(Stack * pstack,int y,int x){
 31     Node node;
 32     node.y=y;
 33     node.x=x;
 34     pstack->pbase[pstack->top]=node;
 35     ++pstack->top;
 36 }
 37
 38 void StackCopy(Stack * pstack1,Stack * pstack2){
 39     pstack2->top=pstack1->top;
 40     for(int i=0;i<pstack2->top;i++)
 41     {
 42         pstack2->pbase[i]=pstack1->pbase[i];
 43     }
 44 }
 45
 46 void StackPop(Stack * pstack){
 47     --pstack->top;
 48 }
 49
 50 Stack stack;
 51 Stack minstack;
 52
 53 //深度优先搜索
 54 void dfs(int y,int x,int step){
 55     int ty,tx;
 56     if(y==endy&&x==endx)
 57     {
 58         if(step<min)
 59         {
 60             StackCopy(&stack,&minstack);
 61             min=step;
 62         }
 63         return;
 64     }
 65
 66     for(int i=0;i<4;i++)
 67     {
 68         ty=y+next[i][0];
 69         tx=x+next[i][1];
 70         if(ty>=0&&ty<n&&tx>=0&&tx<m&&map[ty][tx]!=‘#‘&&sign[ty][tx]==0)
 71         {
 72             StackPush(&stack,ty,tx);
 73             sign[ty][tx]=1;
 74             dfs(ty,tx,step+1);
 75             StackPop(&stack);
 76             sign[ty][tx]=0;
 77         }
 78     }
 79     return;
 80 }
 81
 82 int main(int argc, char** argv) {
 83     printf("请输入行数和列数:");
 84     scanf("%d%d",&n,&m);
 85     printf("请创建地图:\n");
 86     for(int i=0;i<n;i++)
 87     {
 88         scanf("%s",&map[i]);
 89     }
 90     printf("创建的地图如下:\n");
 91     for(int i=0;i<n;i++)
 92     {
 93         printf("%s\n",map[i]);
 94     }
 95     printf("请输入起点(y,x):");
 96     int starty,startx;
 97     scanf("%d%d",&starty,&startx);
 98     printf("请输入终点(y,x):");
 99     scanf("%d%d",&endy,&endx);
100     sign[starty][startx]=1;
101
102     StackInit(&stack);
103     StackInit(&minstack);
104
105     dfs(starty,startx,0);
106     printf("最短路程为%d\n",min);
107
108     printf("最短路径为:\n");
109     map[starty][startx]=‘s‘;    //用字符‘s‘表示起点
110     for(int i=0;i<minstack.top;i++)
111     {
112         map[minstack.pbase[i].y][minstack.pbase[i].x]=‘>‘;
113     }
114     for(int i=0;i<n;i++)
115     {
116         printf("%s\n",map[i]);
117     }
118     return 0;
119 }

时间: 2024-12-05 21:51:34

深度优先搜索(DFS)的相关文章

[LeetCode OJ] Word Search 深度优先搜索DFS

Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be us

深度优先搜索(DFS)详解

深度优先搜索(DFS) [算法入门] 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念. 你可以跳过第二节先看第三节,:) 2.深度优先搜索VS广度优先搜索 2.1演示深度优先搜索的过程 还是引用上篇文章的样例图,起点仍然是V0,我们修改一下题目意思,只需要让你找出一条V0到V6的道路,而无需

【算法入门】深度优先搜索(DFS)

深度优先搜索(DFS) [算法入门] 1.前言深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念. 你可以跳过第二节先看第三节,:) 2.深度优先搜索VS广度优先搜索 2.1演示深度优先搜索的过程还是引用上篇文章的样例图,起点仍然是V0,我们修改一下题目意思,只需要让你找出一条V0到V6的道路,而无需最短

深度优先搜索(dfs)

关于深度优先搜索的总结: 1 dfs 的基本结构:  void dfs(int x){ if( x 超出边界){ return ; }else{ for(遍历){ if(未访问过){ 访问         ; 打上标记    ; dfs(x + 1) ; 去掉标记    ; //极易忘记 } } } return; } 2 用dfs求全排列: 本来好好的,结果sizeof(pointer) 就完蛋了.神秘的内存错误,而且还能正常的跑出一个不正常的结果出来. 想了解sizeof这个小妖精的看这里

python实现基础的深度优先搜索(DFS, depth first search)解决数的全排列问题

数的全排列,是一个很简单的问题,平时我们用笔用纸就能列出答案,但是数列位多的时候,排列的结果就有非常多了,例如有1,2,3,4,5,6,7,8,9这一个数列,有9个数字,则有9!(9的阶乘)这么多种结果.那是非常大的.今天我就来介绍用深度优先搜索来解决这个数的全排列的问题. 深度优先搜索 首先简单介绍一下深度优先搜索,深度优先搜索的关键在于当下该如何做,至于下一步如何做,就与当下做的一样.深度优先搜索的基本模型为: dfs(step): 判断边界:执行相关操作,返回 尝试每一种可能 for( i

深度优先搜索DFS (poj2386,poj1979, poj3009,poj1321,aoj0033,aoj0118)

深度优先搜索(DFS) 往往利用递归函数实现(隐式地使用栈). 深度优先从最开始的状态出发,遍历所有可以到达的状态.由此可以对所有的状态进行操作,或列举出所有的状态. 1.poj2386 Lake Couting 题意:八连通被认为连接在一起,求总共有多少个水洼? Sample Input: 10 12 W........WW. .WWW.....WWW ....WW...WW. .........WW. .........W.. ..W......W.. .W.W.....WW. W.W.W.

深度优先搜索DFS和广度优先搜索BFS

DFS简介 深度优先搜索,从起点开始按照某个原则一直往深处走,直到找到解,或者走不下去,走不下去则回溯到前一节点选择另一条路径走,直到找到解为止. BFS简介 广度优先搜索,从起点开始先搜索其相邻的节点,由此向外不断扩散,直到找到解为止. 举例解释 从1开始去寻找5 DFS: 原则:优先选择左手边 过程:1-2-3-4-6-4-5 BFS: 队列情况:1 2.5     5.3 5出来则找到 遍历图中所有点 DFS: 原则:优先选择左手边 过程:1-2-3-4-6-4-5 BFS: 队列情况:1

深度优先搜索(DFS: Depth First Search)

深度优先搜索是一种树的遍历方式.与此对应的是广度优先搜索. ? 二叉树的优先搜索: ? 如何把一个数学问题转换为树的深度优先搜索问题: 例如:各位数之和为偶数的一个10位二进制数有几个. 我们来分析一下这个问题,首先一共有10位数,然后每一位数都只有两种状态0,1 这可以看做是一个深度为10的一个二叉树,然后用树的深度优先搜索即可解决问题. ? 用C语言实现的代码结构 void DFS(int depth) { ????if(depth==10)????????//递归出口 ????{ ????

深度优先搜索 DFS(Depath First Search, DFS)

深度优先搜索是一种枚举所有完整路径以遍历所有情况的搜索方法.(不撞南墙不回头) DFS一般用递归来实现,其伪代码思路过程一般如下: void DFS(必要的参数){    if (符和遍历到一条完整路径的尾部){        更新某个全局变量的值    }    if (跳出循环的临界条件){        return;    }    对所有可能出现的情况进行递归} 常见题型1: 代码实现: 1 #include <stdio.h> 2 const int maxn = 30; 3 in

深度优先搜索 dfs C++实现

#include<map> #include<iostream> #include<string> #include<vector> using namespace std; static vector<string> order; static map<string, int > vis; void dfs(map<string, vector<string> > link, string top) {  o