DFS--深度搜索
2015-11-05 22:28
120 查看
思想:
1. 递归思想,遇到一个结点,标记,接着找该结点的相邻结点,有就标记,没有就返回上一个结点,找上一个结点的另一个相邻结点,如此。。。。
2.当用邻接表存储图时
当用邻接矩阵存储图时
算法复杂度:假设有n个结点,m条边,每个边结点都要遍历一遍,而且每个结点也会被遍历一遍,共有2m个边结点因此时间复杂度为o(n+2m).
图片出自《图论算法理论、实现及应用》
一般图的搜索会用在网格中,一般将网格抽象成图,从任意一个格找另一个格子的问题。
例如
从一个格子会有四个方向迈出一步,因此在写程序时应该考虑到方向问题,四个方向都有可能,一般用int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}};表示四个方向(有时候也会用到八个方向)
这时候DFS函数应该这样写
1. 递归思想,遇到一个结点,标记,接着找该结点的相邻结点,有就标记,没有就返回上一个结点,找上一个结点的另一个相邻结点,如此。。。。
2.当用邻接表存储图时
当用邻接矩阵存储图时
算法复杂度:假设有n个结点,m条边,每个边结点都要遍历一遍,而且每个结点也会被遍历一遍,共有2m个边结点因此时间复杂度为o(n+2m).
图片出自《图论算法理论、实现及应用》
一般图的搜索会用在网格中,一般将网格抽象成图,从任意一个格找另一个格子的问题。
例如
从一个格子会有四个方向迈出一步,因此在写程序时应该考虑到方向问题,四个方向都有可能,一般用int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}};表示四个方向(有时候也会用到八个方向)
这时候DFS函数应该这样写
void dfs(int x,int y){//x,y表示位置坐标 int i,xi,yi; //可以先判断是否出界 if(map[x][y]到达)return; map[x][y]="*"//表示走过此格了 for(i=0;i<4;i++){ xi=x+dir[i][0]; yi=y+dir[i][1]; if(map[xi][yi]=可以走){ dfs(xi,yi) map[xi][yi]=""//回退清除标记,因为这不还有其他方向可以走 } } }
相关文章推荐
- c#获取当前日期时间
- 在UFT中使用描述性编程
- chapter1-5
- 小技巧2-MRC和ARC下防止Block循环引用
- <蓝牙BLE>cc2541发现服务与特征值
- 【自己的小玩具程序】化学方程式配平【测试中】【未完成】
- mac 程序 Access-JSON-Data
- 2015-11-5
- python入门资料大全
- What is the Database Initialization Parameter That is Associated to an ORA-32004 Error ?
- [笔记]架构探险-从零开始写JavaWeb框架-2.2. 之使框架具有aop特性-干货,让框架支持事务处理
- 解析C#中[],List,Array,ArrayList的区别及应用
- Java中的抽象类和接口
- 视图的定义
- Code Vs 1010 过河卒
- 1105 语法树之冒泡排序
- SQL Server讲义
- gcc编译器
- Introduction to the Standard Template Library
- swift 赋值判断