首先,这里的图不是指的我们一般所说的图结构,而是大小为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(矩形空间)的更多相关文章

  1. 图的遍历DFS

    图的遍历DFS 与树的深度优先遍历之间的联系 树的深度优先遍历分为:先根,后根 //树的先根遍历 void PreOrder(TreeNode *R){ if(R!=NULL){ visit(R); ...

  2. 图的遍历——DFS和BFS模板(一般的图)

    关于图的遍历,通常有深度优先搜索(DFS)和广度优先搜索(BFS),本文结合一般的图结构(邻接矩阵和邻接表),给出两种遍历算法的模板 1.深度优先搜索(DFS) #include<iostrea ...

  3. 图的遍历——DFS

    原创 图的遍历有DFS和BFS两种,现选用DFS遍历图. 存储图用邻接矩阵,图有v个顶点,e条边,邻接矩阵就是一个VxV的矩阵: 若顶点1和顶点5之间有连线,则矩阵元素[1,5]置1,若是无向图[5, ...

  4. 图的遍历——DFS(邻接矩阵)

    递归 + 标记 一个连通图只要DFS一次,即可打印所有的点. #include <iostream> #include <cstdio> #include <cstdli ...

  5. 图的遍历---DFS

    类型一:邻接表 题目一:员工的重要性 题目描述 给定一个保存员工信息的数据结构,它包含了员工唯一的id,重要度 和 直系下属的id. 比如,员工1是员工2的领导,员工2是员工3的领导.他们相应的重要度 ...

  6. 图的遍历(DFS、BFS)

    理论: 深度优先搜索(Depth_Fisrst Search)遍历类似于树的先根遍历,是树的先根遍历的推广: 广度优先搜索(Breadth_First Search) 遍历类似于树的按层次遍历的过程: ...

  7. 16.boost图深度优先遍历DFS

    #include <iostream> #include <boost/config.hpp> //图(矩阵实现) #include <boost/graph/adjac ...

  8. 图的遍历[DFS][BFS]

    #include<iostream> #include<iostream> #include<cstring> #include<queue> #inc ...

  9. 图的数据结构的实现与遍历(DFS,BFS)

    //图的存储结构:const int MAXSIZE = 10;//邻接矩阵template<class T>class MGraph {public:    MGraph(T a[], ...

随机推荐

  1. mysql查看配置生效

    mysql> show status like 'Threads%';+-------------------+-------+| Variable_name     | Value |+--- ...

  2. xxx征集系统项目目标文档

    分组:每四人一组 主题:xxx征集系统 成果: 讨论结束后,每组提交一份课堂讨论记录(电子版发表到博客上,纸质版小组成员签名,下节课提交). 每人根据课堂讨论结果提交一份系统利益相关者描述案例.撰写项 ...

  3. CSS样式表与HTML结合的方法

    从此王子和公主幸福的生活在了一起:) 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文 ...

  4. zzw原创_非root用户启动apache的问题解决(非root用户启动apache的1024以下端口)

    场景:普通用户编译的apache,要在该用户下启动1024端口以下的apache端口 1.假设普通用户为sims20,用该用户编译 安装了一个apache,安装路径为/opt/aspire/produ ...

  5. prefixspan python

    from:https://github.com/chuanconggao/PrefixSpan-py API Usage Alternatively, you can use the algorith ...

  6. libdl.so 动态库加载、查找

    使用libdl.so库 动态库加载原理   动态库中函数的查找已经封装成 libdl.so,有4个函数: dlopen  : 打开一个动态库 dlsym   : 在打开的动态库里找一个函数 dlclo ...

  7. C++获取网络数据

    1.  获取数据 工具libcurl libcurl主要功能就是用不同的协议连接和沟通不同的服务器.libcurl当前支持http, https, ftp, gopher, telnet, dict, ...

  8. day051 django第二天 django初识\代码

    模板渲染 JinJa2 from wsgiref.simple_sever import make_sever from jinjia2 import Template def index(): wi ...

  9. [HAOI2007]反素数

    这道题其实就是求在 [1,n] 的区间内,那个数的约数个数最多,如果同样多,取最小... 那么我们只需要把质因数分解反过来做,然后更新答案就好了... 素数不需要筛出来,直接打表就好,因为只能用到几个 ...

  10. jquery mCustomScrollbar 滚动条宽度的设置

    一.项目使用 $("#iscroll-1, #tree_box, .work, .item1, .item2, .item3, .item4").mCustomScrollbar( ...