题意:算出有多少个池塘的。
转换-> 有多少个连通的W区域 + 8方向搜索
code:
<span style="font-size:18px;">#include <iostream>
#include <fstream>
using namespace std;
int n, m,result;
int map[110][110], visit[110][110];
int dir[8][2] = {
{-1,-1},
{ 0,-1},
{ 1,-1},
{-1, 0},
{ 1, 0},
{-1, 1},
{ 0, 1},
{ 1, 1},
};
int fi, fj;
//fstream in("input.txt");
int find()
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
//not visit && is W
if (!visit[i][j] && map[i][j] == 1)
{
fi = i;
fj = j;
return 1;
}
}
}
return 0;
}
void input()
{
char s[110];
for (int i = 1; i <= n; i++)
{
cin >> s;
for (int j = 0; j < m; j++)
{
// W -> 1 , land -> 0
map[i][j + 1] = (s[j] == 'W' ? 1 : 0);
}
}
}
void dfs(int i, int j)
{
//traverse 8 directions
for (int k = 0; k < 8; k++)
{
int newi = i + dir[k][0];
int newj = j + dir[k][1];
if (newi >= 1 && newi <= n && newj >= 1 && newj <= m && !visit[newi][newj] && map[newi][newj] == 1)
{
visit[newi][newj] = 1;
dfs(newi,newj);
}
}
}
int main()
{
while (cin >> n >> m)
{
memset(visit,0,sizeof(visit));
result = 0;
input();
while (find())
{
visit[fi][fj] = 1;
dfs(fi,fj);
result++;
}
cout << result << endl;
}
//system("pause");
return 0;
}
</span>