图的遍历——DFS(矩形空间)
首先,这里的图不是指的我们一般所说的图结构,而是大小为M*N的矩形区域(也可以看成是一个矩阵)。而关于矩形区域的遍历问题经常出现,如“寻找矩阵中的路径”、“找到矩形区域的某个特殊点”等等之类的题目,在笔试的编程题中经常会出现。下面就这种类型的问题给出一个较为通用的模板:
利用深度优先搜索(DFS)
#include<iostream>
#include<unordered_map>
#include<queue>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<sstream>
#include<set>
#include<map>
using namespace std;
#define M 100
#define N 100 //定义矩形区域的大小
bool visited[M][N];//设置访问标记数组;这里建成一维和二维消耗的空间是一样的,而且二维的更直观
int _map[M][N];//矩形区域的范围,往往由题目给出
/*
Check函数:
(1)两个最基本的条件:该区域未被访问过和未超出矩形区域的范围。
(2)根据题目要求,还可能有其他的限制条件和其他形参
*/
bool Check(int c_row,int c_col,int rows,int cols,...)//用以检验当前位置是否合法
{
if(!visited[c_row][c_col] && c_row >=0 && c_row < rows && c_col >= 0 && c_col < cols && ...)
return true;
else
return false;
}
/*
DFSTraverse函数:
(1)函数的返回值类型根据具体题目可调整,有时也为int、bool型等
(2)函数的形参根据题目要求可能还有其他参数
(3)遍历的起始点根据题目调整
*/
void DFSTraverse(int rows,int cols,..)
{
if(rows < 0 || cols < 0 || ...)
return;//非法输入的处理
memset(visited,0,sizeof(visited));//初始化访问标记数组
DFS(0,0,rows,cols,...)//此处是以(0,0)开始遍历;根据题目可调整,也可以为所有的点
/*
或者
for(int i = 0; i < rows; i++)
for(int j = 0; j < cols; j++)
DFS(i,j,rows,cols,....)
*/ }
/*
DFS函数:
(1)函数的形参根据题目要求可能还有其他参数
(2)函数的返回值不一定是void
*/
void DFS(int c_row,int c_col,int rows,int cols,...)
{
if(Check(c_row,c_col,rows,cols,...))//按照规则遍历相关节点
{
DFS(c_row,c_col + 1,row,cols,...)...
DFS(c_row + 1,c_col,row,cols,...)... //...表示相应的操作,如“+”、“||”
DFS(c_row,c_col - 1,row,cols,...)...
DFS(c_row - 1,c_col,row,cols,...)...
....//其他操作
}
....//其他操作
}
int main()
{
DFSTraverse(M,N,....);
}
整个DFS的过程和一般图的过程(见:https://www.cnblogs.com/wangkundentisy/p/9284886.html)类似,主要区别在于:
(1)矩形区域的限制条件更多,而一般图结构的限制条件就是顶点没被访问过。
(2)按规则遍历相关节点相当于一般图中的寻找邻接点的过程。
(3)矩形区域的DFS更灵活;这里可以结合《剑指offer(第二版)》面试题12和13来更好的理解。
(4)一般常见的DFS应用就是:树的遍历、图的遍历和矩形区域的遍历;要看题目属于哪一种类型。
图的遍历——DFS(矩形空间)的更多相关文章
- 图的遍历DFS
图的遍历DFS 与树的深度优先遍历之间的联系 树的深度优先遍历分为:先根,后根 //树的先根遍历 void PreOrder(TreeNode *R){ if(R!=NULL){ visit(R); ...
- 图的遍历——DFS和BFS模板(一般的图)
关于图的遍历,通常有深度优先搜索(DFS)和广度优先搜索(BFS),本文结合一般的图结构(邻接矩阵和邻接表),给出两种遍历算法的模板 1.深度优先搜索(DFS) #include<iostrea ...
- 图的遍历——DFS
原创 图的遍历有DFS和BFS两种,现选用DFS遍历图. 存储图用邻接矩阵,图有v个顶点,e条边,邻接矩阵就是一个VxV的矩阵: 若顶点1和顶点5之间有连线,则矩阵元素[1,5]置1,若是无向图[5, ...
- 图的遍历——DFS(邻接矩阵)
递归 + 标记 一个连通图只要DFS一次,即可打印所有的点. #include <iostream> #include <cstdio> #include <cstdli ...
- 图的遍历---DFS
类型一:邻接表 题目一:员工的重要性 题目描述 给定一个保存员工信息的数据结构,它包含了员工唯一的id,重要度 和 直系下属的id. 比如,员工1是员工2的领导,员工2是员工3的领导.他们相应的重要度 ...
- 图的遍历(DFS、BFS)
理论: 深度优先搜索(Depth_Fisrst Search)遍历类似于树的先根遍历,是树的先根遍历的推广: 广度优先搜索(Breadth_First Search) 遍历类似于树的按层次遍历的过程: ...
- 16.boost图深度优先遍历DFS
#include <iostream> #include <boost/config.hpp> //图(矩阵实现) #include <boost/graph/adjac ...
- 图的遍历[DFS][BFS]
#include<iostream> #include<iostream> #include<cstring> #include<queue> #inc ...
- 图的数据结构的实现与遍历(DFS,BFS)
//图的存储结构:const int MAXSIZE = 10;//邻接矩阵template<class T>class MGraph {public: MGraph(T a[], ...
随机推荐
- .net asp 实现json 格式跨域访问 的方法
在<configuration> 配置目录下添加允许跨域的头部信息 //webapi 默认的web.config有配置 //1)删除 下面参数 否者WEB API 会 出现405 错误 没 ...
- "她等待刀尖已经太久"--茨维塔耶娃诗抄
生活 1 你无法夺走我的红晕—— 它强大——如同河水的汛潮! 你是猎人,可我不会上当, 你若追逐,我就会逃跑. 你无法夺走我鲜活的灵魂! 就这样,在急遽的追逐中—— 一匹阿拉伯的骏马, 微 ...
- Container&injection
容器(Container)就是组件和底层服务细节之间的接口.在web组件.企业级Bean等能够执行之前,它必须被装配为一个JavaEE模块,并部署在容器上. 在JavaEE5时代通过注解的方式注入(i ...
- 简述采用四次握手机制释放TCP连接的四个步骤
(1)源结点A向目的结点B发送连接释放请求(FIN,seg=x),并且不再向B发送数据,但仍继续接收从B发来的数据. (2)目的结点B收到此连接释放请求后立即向A发出确认(ACK,ack=x+1),但 ...
- Spring Boot + Spring Cloud 实现权限管理系统 配置中心(Config、Bus)
技术背景 如今微服务架构盛行,在分布式系统中,项目日益庞大,子项目日益增多,每个项目都散落着各种配置文件,且随着服务的增加而不断增多.此时,往往某一个基础服务信息变更,都会导致一系列服务的更新和重启, ...
- python四
三元运算 name = "张三" if 1 == 2 else "李四" print(name) name1 = "张三" if 1 == ...
- 新一代的json--fetch
fetch( "http://jsontest.bceapp.com/hi", { method:"POST", mode:"core", ...
- static静态全局变量和static静态局部变量
static静态全局变量: 静态全局变量就是将全局变量变成静态的.如何变?——全局变量加个static. static就是一个存储类说明符,a这个全局变量就成了一个静态全局变量了. 静态全局变量的特点 ...
- Django进阶之CSRF
简介 django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对于django中设置防跨站请求伪造功能有 ...
- redis列表操作基本命令
RPUSH:从列表尾部插入一个元素,RPOP:返回列表最后一个元素并从列表删除LPUSH:从列表头部插入一个元素,LPOP:返回列表第一个元素并从列表删除(没看到命名的介绍,个人理解R就是right, ...