DFS(深度优先遍历)
DFS的意思为深度优先遍历。
一、DFS的简介:
深度优先遍历(DFS)也叫深度优先搜索。它的定义是:不断地沿着顶点的深度方向遍历。顶点的深度方向是指它的邻接点方向。
二、DFS的实现步骤:
1、从顶点出发。
2、访问顶点,也就是根节点。
3、依次从顶点的未被访问的邻接点出发,进行深度优先遍历;直至和顶点有路径相通的顶点都被访问。
4、若此时尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优遍历,直到所有顶点均被访问过为止。
此次我以《算法竞赛入门经典第2版》6.4.1中的例题6-12《油田》为例
输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符所在格子相邻(横竖,对角线)就说他们属于一个八连块
0 0 0 0@
0@@ 0@
0@ 0 0@
@@@0@
@@0 0@
图中就有两个八连块
#include<cstdio>//c++中stdio.h的头文件
#include<cstring>//semset函数头文件
const int maxn=100;//定义一个int类型的常量
char pic[maxn][maxn];//定义一个二维数组用于存储输入的字符
int m, n,idx[maxn][maxn];//idx数组用于给每个字符标记一个数,表示已经访问过(防止多次访问)
void dfs(int r,int c,int id){if(r<0||r>=m||c<0||c>=n) return;//格子出界返回;if(idx[r][c]>0||pic[r][c]!='@') return;//不是@或者这个@已经被赋值过了;for(int dr=-1;dr<=1;dr++){for(int dc=-1;dc<=1;dc++)if(dr!=0||dc!=0) dfs(r+dr,c+dc,id);//不是本身就进行递归}//对数组中某一个元素a[r][c]周围所以数遍历一遍找到有‘@’符号且没有被标记过的元素,再遍历此元素周围的元素。及找到了一条联通的路,其标记的数下标相同
}
int main(){scanf("%d%d",m,n);for(i=0;i<m;i++) scanf("%s",pic[i]);semset(idx,0,sizeof(idx));int cnt=0;for(i=0;i<m;i++){for(j=0;j<n;j++){if(id[i][j]==0&&pic[i][j]='@')dfs(i,j,++cnt);}}printf("%d\n",cnt);}
return 0;
}
memset()函数原型
extern void*memset(void*buffer,int c,int count)
buffer为指针或者数组
c为赋给buffer的值
count为buffer的长度
memset(a,0,sizeof(a))用于清空数组a或者给a数组赋值为0
也可以使用在结构体里
struct Student st{
int a;
char b[10];
int c[10];
}
memset(&st,0,sizeof(struct Student st));
刚分配的内存空间,或者是被你用过的内存空间里面的数据是不固定的为了避免这些无用的数据给自己的程序带来影响,可以用memset把这些内存里面的数据置成某个数值一般情况下是置0,当然,如果你的程序不会受这些无用数据影响,就不用做这个工作了所谓“初始化”,当然是指将你定义的变量或申请的空间赋予你所期望的值,例如语句int i=0;就表明定义了一个变量i,并初始化为0;如果int j=5;就表明定义了一个变量j,并初始化为5。
但是对于大块儿内存的分配,这种方法当然不行,例如int arr[100];定义了数组arr,包含100个元素,如果你写成int arr[100]=0;想将数组全部内容初始化为0,是不行的,连编译都不能通过。这种情况的初始化,有两种方法,一种是一个一个的初始化,如for(int i=0;i<100;i++)arr[i]=0;就完成了数组的初始化。另一种方法,就是使用memset:一个语句就够了--memset(arr,0,sizeof(int)*100);
各参数解释如下:arr是数组的首地址,0就是要讲这些地址的内容赋值为0,sizeof(int)求出int类型的长度,乘以100就表示arr数组的整个长度。
DFS(深度优先遍历)相关推荐
- 一一计划(Day 14)邻接表法存储图,BFS广度优先遍历,DFS深度优先遍历
邻接表法存储 邻接表发存储需要时无权无向图.用数组+链表的方式完成 数组用来记录地点,链表来记录每一个地点对应的相邻地点 1.构造一个数据结构来存放数组的序号以及指针用来指向链表 2.创造结点,构建链 ...
- LeetCode系列-DFS深度优先遍历
DFS 详细介绍 秉承不撞南墙不回头的道理,标记当前节点,从当前节点出发采用递归的方式访问相邻的节点,一直到底. 递归出口:1.已经访问完从当前节点一直相邻的所有节点为止.2.超出边界.此当前节点已经 ...
- 打牌博弈 dfs深度优先遍历搜索 排课表 拓扑排序 升序字符串 动态规划 剑指offer编程题整理 leetcode每日算法题
递归,回溯, 深度优先搜索 题目描述 有一叠扑克牌,每张牌介于1和10之间 有四种出牌方法: 单出1张 出2张对子 出五张顺子,如12345 出三连对子,如112233 给10个数,表示1-10每种牌 ...
- 图的深度优先遍历DFS(JAVA)
图的深度优先遍历算法 在此介绍图的基本算法之一的深度优先遍历(DFS)算法 广度优先搜索(BFS). 什么是DFS 图是由节点(Node)和路径(Route)组成的一种数据结构,用于反应各节点间的关系 ...
- 图的深度优先遍历(Depth First Search)
图的深度优先遍历(Depth First Search) 基本思想 类似于二叉树的先序遍历 假设图中所有结点均未被访问,从初始结点访问,访问其第一个邻接结点,接着以被访问的邻接结点作为初始结点,访问它 ...
- python 遍历_python实现图广度优先遍历、深度优先遍历
一.广度优先遍历-BFS 顾名思义,BFS总是先访问完同一层的结点,然后才继续访问下一层结点,它最有用的性质是可以遍历一次就生成中心结点到所遍历结点的最短路径,这一点在求无权图的最短路径时非常有用.广 ...
- 连通分量 java_Java编程实现深度优先遍历与连通分量代码示例
深度优先遍历 深度优先遍历类似于一个人走迷宫: 如图所示,从起点开始选择一条边走到下一个顶点,没到一个顶点便标记此顶点已到达. 当来到一个标记过的顶点时回退到上一个顶点,再选择一条没有到达过的顶点. ...
- 数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现)
目录 深度优先遍历(DFS)和广度优先遍历(BFS)原理 1.自己的原理图 2.官方原理图 一.邻接矩阵的深度优先遍历(DFS) 1.原理图 2. 过程: 3.总代码 二.邻接表的深度优先遍历(DFS ...
- 三十二、图的创建深度优先遍历(DFS)广度优先遍历(BFS)
一.图的基本介绍 为什么要有图 前面我们学了线性表和树 线性表局限于一个直接前驱和一个直接后继的关系 树也只能有一个直接前驱也就是父节点 当我们需要表示多对多的关系时, 这里我们就用到了图. 图的举例 ...
- dfs遍历和bfs遍历python_广度优先遍历(BFS)和深度优先遍历(DFS)
BFS: 思想: 对于图中的初始节点,先遍历初始节点的一阶邻居,当初始节点的一阶邻居都被遍历完了之后,再遍历初始节点的二阶邻居,直至所有节点都被遍历完(或找到符合条件的节点) 过程: 三要素:(1)先 ...
最新文章
- 一款NPN三极管测量: BC547C
- Java相对路径/绝对路径总结(转)
- 软工作业3—词频统计
- 虚拟机 Linux ubuntu16.04 对 windows 设置共享文件夹教程(samba)(ubuntu16.04换源【更换下载源】【更换源】【更新源】)(如果连不上需要开SSH服务)
- 王炸!Azure云助力.NET6现高光时刻(VS2022实战尝鲜)
- 公司想申请网易企业电子邮箱,怎么样?
- 福布斯发布美国富豪榜:贝索斯居首 盖茨跌出前二
- python爬微博粉丝最多的明星_2020明星微博粉丝排行榜,谁的粉丝数量最多呢
- bootstrap 步骤条_无骨香酥炸鸡柳,做法原来如此简单,3个关键步骤,学会可以开店...
- 测试驱动开发心得体会
- win10系统通过WSL/WSL2安装各种linux版本,开启图形桌面
- CAD2012安装失败怎么回事?
- 【随便聊聊】Mac 笔记本该怎么选?
- java多线程12:阻塞队列Queue
- 从反反鸡汤谈过犹不及
- 京东商城手机频道商品价格信息的抓取
- iit delhi_IIT的完整形式是什么?
- 【2018】—不忘初心,砥砺前行
- 【原创】车床操作点滴-不断更新
- 项目规划怎么做?如何轻松做好项目规划?