深度優先搜索初嘗試-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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章