您的位置:首页 > 其它

深度搜索应用之黑白图像(非递归)

2014-05-22 16:10 162 查看
深度搜索应用之黑白图像(非递归)

前言:

  使用深度搜索,有两个方法:递归,栈。本质是栈。

  递归有一个缺陷,栈溢出。栈有一个缺陷,程序相对递归更复杂。

练习题:

  输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数。如果两个黑格子有公共边或者公共顶点,就说它们属于同一个八连块。(题意是让求连在一起的块有几个,图见书本)

使用递归求解:点这里

使用栈求解:

#include <iostream>
#include <memory.h>
#include <stack>
using namespace std;
const int MAXN=8;

typedef struct
{
int x;
int y;
} node;

stack<node> stack_temp;
node node_temp;
void push_value(int x,int y)
{
node_temp.x=x;
node_temp.y=y;
stack_temp.push(node_temp);
}

int mat[MAXN][MAXN]= {0,0,0,0,0,0,0,0,
0,1,0,0,1,0,0,0,
0,0,0,1,0,1,0,0,
0,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,
0,1,1,1,0,0,0,0,
0,0,1,0,1,0,0,0,
0,0,0,0,0,0,0,0
},vist[MAXN][MAXN]= {0};

void dfs(int x,int y)
{
push_value(x,y);
vist[x][y]=1;
bool flag_break=false;
bool flag_for_over=false;
while(!stack_temp.empty())
{
int temp_x=stack_temp.top().x,temp_y=stack_temp.top().y;

/**< 对周围的8个结点进行遍历 */
for(int i=temp_x-1,last_x = temp_x+1; i<=last_x; ++i)
{
for(int j=temp_y-1,last_y = temp_y+1; j<=last_y; ++j)
{
if(mat[i][j]&&!vist[i][j])
{
cout<<"("<<i<<","<<j<<")"<<endl;
vist[i][j]=1;
push_value(i,j);
flag_break=true;
break;
}
}
/**< 用于标志一个有效结点,方便对下周围的结点进行遍历 */
if(flag_break)
{
flag_break=false;
break;
}

/**< 用于标志一个for循环是否结束,用于判断出栈的标志 */
if(i>=last_x)
{
flag_for_over=true;
break;
}
}

/**< 若一个循环结束,则踢出一个结点 */
if(flag_for_over)
{
stack_temp.pop();
flag_for_over=false;
}
}
return ;
}

int main()
{
int count_=0;
memset(vist,0,sizeof(vist));
for(int i=1; i<=6; ++i)
{
for(int j=1; j<=6; ++j)
{
if(mat[i][j] && !vist[i][j])
{
++count_;
dfs(i,j);
}
}
}
cout<<count_<<endl;
return 0;
}


参考资料:点这里
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: