您的位置:首页 > 其它

深度优先搜索初尝试-DFS-LakeCounting POJ No.2386

2016-03-10 11:26 405 查看
DFS入门的一道经典题目:LakeCounting

用栈或队列来实现:

#include<cstdio>
#include<stdlib.h>
#include<iostream>
#include<stack>
using namespace std;

int n,m;
int pla[10][3]={{1,0},{1,1},{1,-1},{-1,-1},{-1,0},{-1,1},{0,-1},{0,1}};//对坐标进行移动的向量

struct place
{
int x,y;
};//用结构体表示坐标

char a[105][105];

//核心部分DFS
void DFS(int i,int j)
{
place begin,between;
stack<place>s;//stack的类型是坐标place
begin.x=i;
begin.y=j;//从(i,j)开始搜索

s.push(begin);//存入s

while(!s.empty())//为空搜索结束
{
begin=s.top();//提出栈顶进行搜索
s.pop();

for(i=0;i<8;i++)
{
between.x=begin.x+pla[i][0];
between.y=begin.y+pla[i][1];//加上坐标

if(between.x>=0 && between.x<=n && between.y>=0 && between.y<=m && a[between.x][between.y]=='W')//在草地的范围内且是水
{
s.push(between);//入栈
a[between.x][between.y]='.';//改成‘.’防止重复判断
}
}

}

}
int main()
{
int i,j,k,t=0,sum=0;

scanf("%d%d",&n,&m);
getchar();

for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%c",&a[i][j]);
}

getchar();
}

for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(a[i][j]=='W')
{
DFS(i,j);
sum++;//调用几次DFS即是水潭的个数
}
}
}

printf("%d\n",sum);

return 0;
}

用栈来实现深度优先搜索。

大概的思路我用伪代码来解释:

伪代码:
void DFS(传入刚开始坐标)
{
stack<坐标>s;
坐标begin,between.
begin存刚刚开始的坐标;
begin入栈;

while(s不为空)//s为空时停止搜索
{
坐标begin=栈顶坐标;
栈顶坐标出栈,开始搜索。
for(遍历八个搜索向量)
{
begin+搜索向量;
if(此时搜索到了水坑)
{
begin+搜索向量入栈(即此时搜索到的坐标);
被搜索到的这个坐标标记为土地;
}
}

}
}


2016/3/10

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