图的遍历——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[], ...
随机推荐
- 通过class改变样式
1.判断class属性 判断一个元素中是否含有指定的class属性值 function hasClass(obj,cn){ //创建正则表达式 var reg=new RegExp("\\b ...
- redis pipline 和 事务
1. Pipeline:“管道”,和很多设计模式中的“管道”具有同样的概念,pipleline的操作,将明确client与server端的交互,都是“单向的”:你可以将多个command,依次发给se ...
- mysql 取年、月、日、时间
select id, phone,time,year(time),month(time), DAY(time),TIME(time) from user where phone='xxxxxx' #分 ...
- 理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number)
原文见:http://packetlife.net/blog/2010/jun/7/understanding-tcp-sequence-acknowledgment-numbers/ from:ht ...
- Vue(六) 表单与 v-model
学习使用 v-model 指令完成表单数据双向绑定 基本用法 表单控件在实际业务较为常见,比如单选,多选.下拉选择.输入框等,用他们可以完成数据的录入.校验.提交等.Vue.js 提供了 v-mode ...
- git多账号切换
修改: git config --global user.name "Your_Username" git config --global user.email username@ ...
- C语言的通用指针类型(void *)
reference: https://blog.csdn.net/cumirror/article/details/4631701 https://blog.csdn.net/Lee_Shuai/ar ...
- json:java中前台向后台传对象数据
前台传入的是一个json类型的数据,如何在后台解析成想要的数据类型? 例如: 后台获取了前台一个string类型的数据@RequestParam(value = "forceUpgradeT ...
- GraphHttpClient概述
博客地址:http://blog.csdn.net/FoxDave 目前这个东西还在预览阶段,所以不推荐在正式生产环境中使用. 我们可以使用Microsoft Graph接口来构建强大的解决方案来访问 ...
- .net ORM框架(Dapper简单应用)
1.引入 Dapper.dll类库 2.创建书籍模型book using System; using System.Collections.Generic; using System.Linq; us ...