有一个大小M×N的园子,雨后积起了水。求院子内有多少水洼?
W表示积水。
在以 ’ W ‘ 为中心的九宫格内有另一 ’ W ‘ 即视为相连。
For example:
Input:
12 10
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
Output:
3
这道题用深搜即可。
#include<cstdio>
bool successed(char map[101][101], int m, int n, int&i, int&j);
void dfs(char map[101][101], int m, int n, int i, int j);
int main()
{
char map[101][101];
int m, n, i, j, num;
while (scanf("%d %d", &m, &n) != EOF)
{
num = 0;
for (i = 0; i < m; i++)
scanf("%s", &map[i]);
i=0,j=0;
while (!successed(map, m, n, i, j)) //当map内没有‘W’时判断搜索完毕
{
dfs(map, m, n, i, j);
num++; //记录搜索次数
}
printf("%d\n", num);
}
return 0;
}
void dfs(char map[101][101], int m, int n, int i, int j) //深搜
{
map[i][j] = '.'; //本位先置‘.’
if (i<n - 1 && map[i + 1][j] == 'W') //搜索相邻位置
dfs(map, m, n, i + 1, j);
if (i>0 && map[i - 1][j] == 'W')
dfs(map, m, n, i - 1, j);
if (j<m - 1 && map[i][j + 1] == 'W')
dfs(map, m, n, i, j + 1);
if (j>0 && map[i][j - 1] == 'W')
dfs(map, m, n, i, j - 1);
if (i<n - 1 && j<m - 1 && map[i + 1][j + 1] == 'W')
dfs(map, m, n, i + 1, j + 1);
if (i>0 && j>0 && map[i - 1][j - 1] == 'W')
dfs(map, m, n, i - 1, j - 1);
if (i<n - 1 && j>0 && map[i + 1][j - 1] == 'W')
dfs(map, m, n, i + 1, j - 1);
if (i>0 && j<m - 1 && map[i - 1][j + 1] == 'W')
dfs(map, m, n, i - 1, j + 1);
}
bool successed(char map[101][101], int m, int n, int&i, int&j)
{
for (i; i<n; i++) //搜索‘W’
for (j=0; j<m;j++)
if (map[i][j] != '.')
return false;
return true;
}