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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值