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