bfs(队列实现)_dfs(递归以及显式栈实现)
来源:互联网 发布:数据坂田荣男吴清源 编辑:程序博客网 时间:2024/06/05 13:21
下面是算法竞赛入门经典上p107那道题目的dfs的实现(dfs()函数直接使用递归,dfsSTACK()使用的显式栈)
#include <stdio.h>#include <string.h>#define MAXN 100int mat[MAXN][MAXN],vis[MAXN][MAXN];char str[MAXN];typedef struct{int x;int y;}mypoint;mypoint stack[MAXN];//此版本的函数利用了显式栈,防止图比较大的时候dfs那个版本可能出现的栈溢出void dfsSTACK(int x,int y){int top=0,tempx,tempy;mypoint temp={x,y};stack[0]=temp;while(top>=0){tempx=stack[top].x;tempy=stack[top].y;top--;if(!mat[tempx][tempy] || vis[tempx][tempy]==1)//如果是白色格子或者此格子已经被访问过continue;vis[tempx][tempy]=1;top++;stack[top].x=tempx-1;stack[top].y=tempy-1;top++;stack[top].x=tempx-1;stack[top].y=tempy;top++;stack[top].x=tempx-1;stack[top].y=tempy+1;top++;stack[top].x=tempx;stack[top].y=tempy-1;top++;stack[top].x=tempx;stack[top].y=tempy+1;top++;stack[top].x=tempx+1;stack[top].y=tempy-1;top++;stack[top].x=tempx+1;stack[top].y=tempy;top++;stack[top].x=tempx+1;stack[top].y=tempy+1;}}void dfs(int x,int y){if(!mat[x][y] || vis[x][y]==1)//如果是白色格子或者此格子已经被访问过return;vis[x][y]=1;//打上访问过标记dfs(x-1,y-1);dfs(x-1,y);dfs(x-1,y+1);dfs(x,y-1);dfs(x,y+1);dfs(x+1,y-1);dfs(x+1,y);dfs(x+1,y+1);}int main(){int n;scanf("%d",&n);memset(mat,0,sizeof(mat));memset(vis,0,sizeof(vis));for(int i=0; i<n; i++){scanf("%s",str);for(int j=0; j<n; j++){mat[i+1][j+1]=str[j]-'0';}}int count=0;stack[0].x=1;stack[0].y=1;for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){if(mat[i][j] && !vis[i][j]){count++;//dfs(i,j);dfsSTACK(i,j);}}}printf("count:%d",count);return 0;}
此外一道题目同时用DFS BFS 见http://blog.csdn.net/u013861066/article/details/40475993
leetcode_题解_Surrounded Regions这篇文章,可以比较两者区别。
注意:对于二叉树的遍历,如果使用dfs的时候,要注意使用显式栈的时候的入栈顺序来保证遍历二叉树的顺序准确性。
方法1:直接递归
1.访问当前节点
2.左子树递归调用
3.右子树递归调用
方法2:显式栈
1.访问栈顶元素
2.栈顶元素的右子树根节点入栈
3.栈顶元素的左子树根节点入栈
0 0
- bfs(队列实现)_dfs(递归以及显式栈实现)
- LintCode_拓扑排序_DFS实现
- 自己动手实现非递归BFS
- 【非递归实现 BFS】 + 栈
- bfs+路径记录(数组模拟队列实现)
- 二叉树三种遍历(递归以及非递归实现)
- POJ 3278 用队列实现BFS搜索
- 数据结构——图的BFS的邻接矩阵遍历(BFS是由队列实现的)
- 队列的定义以及实现
- java_实现队列以及实例
- //******************快速排序非递归算法(队列实现)*****************************
- 利用邻接矩阵存储无向图,并实现BFS(非递归) DFS(递归+非递归)两种遍历
- BFS和DFS详解以及java实现
- BFS和DFS详解以及java实现
- 二叉树镜像之递归、栈、队列实现
- 堆排序的递归实现以及非递归实现
- 两个栈实现一个队列以及两个队列实现一个栈(Java)
- 两栈实现队列,以及两队列实现栈
- 社説 20150128 若者雇用法案 企業は職場情報の積極提供を
- 获取项目文件目录
- 删除字符串中指定位置的字符
- mtk preloader
- CentOS下的账户管理
- bfs(队列实现)_dfs(递归以及显式栈实现)
- MFC命名规则
- CSS:【1st】选择器
- 社説 20150128 衆院代表質問 人質事件で与野党は結束せよ
- 转载 CoreLocation的详细介绍
- android基础学习--eclipse下android开发,如何查看源码、私有库源码
- Python 安装setuptools报‘ascii’错误
- Android招式之美,学习笔记,开篇
- 译文 日经春秋 20150128