图的遍历——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[], ...
随机推荐
- 977. Squares of a Sorted Array有序数组的平方
网址:https://leetcode.com/problems/squares-of-a-sorted-array/ 双指针法 把左端的元素和右端的元素比较后挑出绝对值大的,将其平方放入ans中,并 ...
- python----常用模块(hashlib加密,Base64,json)
一.hashlib模块 1.1 hashlib模块,主要用于加密相关的操作,在python3的版本里,代替了md5和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, S ...
- 牛客网第4场A
链接:https://www.nowcoder.com/acm/contest/142/A 来源:牛客网 题目描述 A ternary , , or . Chiaki has a ternary in ...
- excel表格中,怎么根据一列重复的数据求对应另一列总和
如下: 求出姓名对应分数总和对应 : 首先复制一份Sheet2 对Sheet1进行操作选中A列姓名 数据->删除重复项->以前选中区域排序->删除重复项 然后删除对应成绩项选中张三对 ...
- 【转】Ubuntu英文系统下安装中文输入法
转自:https://my.oschina.net/No5stranger/blog/290026 ubuntu默认的输入法是ibus,综合网上评论,fcitx的支持者更多,而且个人感觉fcitx也的 ...
- SocketServer模块,hmac模块验证client合法性
hmac模块: 1.模块初识: import hmac # h = hmac.new() #括号里要给它连个bytes类型,一个是自定义的secret_key,一个是你想进行加密的bytes # 密文 ...
- 错误:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'hdjyproj.t_userinfo' do ...
- python xml文件解析
参考链接:http://www.runoob.com/python/python-xml.html
- Linux的相关概念
1 Linux的相关概念 1.1 什么是操作系统? 操作系统(英语:operating system,缩写:OS)是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石.操作系统需要处 ...
- ipa 注入 dylib
前些日子再github找到了一个内存修改器 DLGMemor 免越狱在app内植入修改器,感觉很不错,就尝试去看看是否可行. 用到的工具: Xcode 10. optool 首先要做的,安装 opt ...