解题分析:本题采用DFS算法,任取‘W’位置,不断遍历,用“.”替代“W”。DFS执行的次数就是所求的结果
#include <iostream>
#include <algorithm>
using namespace std;
#define Max_M 100
#define Max_N 100
char a[Max_M][Max_N],M,N;
void dfs(int x,int y)
{
a[x][y] = '.';
for(int dx = -1;dx <= 1;dx++)
{
for(int dy = -1;dy <= 1;dy++)
{
int nx = x + dx;
int ny = y + dy;
if(nx > 0&&nx < M&&ny > 0&&ny < N&&a[nx][ny] == 'W')
dfs(nx,ny);
}
}
}
int main()
{
int i,j,ans = 0;
cin >> M >> N;
for(i = 0;i < M;i++)
for(j = 0;j < N;j++)
cin >> a[i][j];
for(i = 0;i < M;i++)
{
for(j = 0;j < N;j++)
{
if(a[i][j] == 'W')
{
dfs(i,j);
ans++;
}
}
}
cout << ans << endl;
return 0;
}
由于对有个坐标需要考虑它的八个方位的情况。因此,算法的时间复杂度是:O(8MN)=O(M*N)