下面是算法竞赛入门经典上p107那道题目的dfs的实现(dfs()函数直接使用递归,dfsSTACK()使用的显式栈)
#include <stdio.h>
#include <string.h>
#define MAXN 100
int 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.栈顶元素的左子树根节点入栈