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
原创粉丝点击