好久都没有写过搜索题了,典型的dfs,之前也做过专题训练,写起来也挺顺手的,今日一练,还是发现了一点小小的疏忽
思路:这就是一道典型的搜索题,就是多了个斜对角的情况,除此之外没有任何坑点和卡点,可以考虑直接用dfs来解决。题中也明确说明了每个区域可以有八个相邻的方向,直接遍历搜索即可,注意一下边界。
然而,心血来潮,考虑到边的对称性,因此将问题简化为只考虑其中的四条边,然而事实证明这种简化过程是错误的,会筛掉U字形区域,可见每次简化都需要经过深思熟虑,一点小小疏忽都会导致错误
/*
Author:Owen_Q
*/
#include <bits/stdc++.h>
using namespace std;
bool p[110][110];
int n,m;
void dfs(int x,int y)
{
p[x][y] = false;
if(x-1>=0)
{
if(y-1>=0&&p[x-1][y-1])
{
dfs(x-1,y-1);
}
if(p[x-1][y])
{
dfs(x-1,y);
}
if(y+1<m&&p[x-1][y+1])
{
dfs(x-1,y+1);
}
}
if(y-1>=0&&p[x][y-1])
{
dfs(x,y-1);
}
if(y+1<m&&p[x][y+1])
{
dfs(x,y+1);
}
if(x+1<n)
{
if(y-1>=0&&p[x+1][y-1])
{
dfs(x+1,y-1);
}
if(p[x+1][y])
{
dfs(x+1,y);
}
if(y+1<m&&p[x+1][y+1])
{
dfs(x+1,y+1);
}
}
return ;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=0;i<n;i++)
{
char line[110];
scanf("%s",line);
for(int j=0;j<m;j++)
{
if(line[j]=='W')
{
p[i][j] = true;
}
else
{
p[i][j] = false;
}
}
}
int sum = 0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(p[i][j])
{
sum++;
dfs(i,j);
/*for(int k=0;k<n;k++)打印水泊
{
for(int l=0;l<m;l++)
{
cout<<p[k][l];
}
cout<<endl;
}
cout << endl;*/
}
}
}
printf("%d\n",sum);
}
return 0;
}