题目描述
由于最近下雨,田地里各处积水,田地有 N × M (1 <= N <= 100;1 <= M <= 100)平方。每个平方要么包含水(‘W’),要么包含陆地(’.’)。计算出田地里有多少水塘。水塘是一组有水的连通的土地,其中每个平方被认为与它的所有八个邻居相邻(即包括斜方位)。
给出一张图,确定有多少个水塘。
输入格式
第 1 行:两个正整数 N 和 M,表示田地的长和宽。 第 2 行到第 N+1 行:每行M个字符代表一排田地。每个字符可以是’W’或’.’。字符之间没有空格。
输出格式
第1行:水塘个数
样例输入
10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
样例输出
3
数据范围
1 <= N <= 100
1 <= M <= 100
题目彩蛋
你有没有发现这个出题的助教似乎不会 Latex
?
题目解答
真的是实力水题,你值得拥有!直接把之前的 (新版)SJTU-OJ-1030. 二哥的地图 相关的数据修改了一下,注意 要修改的是 dx
dy
的数组,因为本题是八个方向,那就是,然后注意字符串的读取,还有 bfs 的里面的for 循环要修改一下个数!
int dx[8] = {0, 0, 1, -1, 1, 1, -1, -1};
int dy[8] = {1, -1, 0, 0, 1, -1, -1, 1};
完整代码AC如下:
#include <iostream>
#include <queue>
using namespace std;
int m, n;
bool testmap[510][510]; // true表示池塘。
int dx[8] = {0, 0, 1, -1, 1, 1, -1, -1};
int dy[8] = {1, -1, 0, 0, 1, -1, -1, 1};
class node
{
public:
int x;
int y;
};
bool bfs_CheckNextstep(node checkobject)
{
if (checkobject.x < 0 || checkobject.x >= n)
return false;
if (checkobject.y < 0 || checkobject.y >= m)
return false;
if (testmap[checkobject.x][checkobject.y] == false)
return false;
else
return true;
}
void bfs_CheckSurrounding(node Place_Checked)
{
queue<node> bfsque;
bfsque.push(Place_Checked);
node currentplace, nextplace;
while (!bfsque.empty())
{
currentplace = bfsque.front();
bfsque.pop(); // 把最前面的元素弹出去!
for (int i = 0; i < 8; i++)
{
nextplace.x = currentplace.x + dx[i];
nextplace.y = currentplace.y + dy[i];
if (bfs_CheckNextstep(nextplace) == true)
{
testmap[nextplace.x][nextplace.y] = false;
bfsque.push(nextplace);
}
}
}
}
int main()
{
char tempcin;
int ans = 0;
cin >> n >> m;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> tempcin;
if (tempcin == 'W')
{
testmap[i][j] = true;
}
else
{
testmap[i][j] = false;
}
}
}
node temp;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (testmap[i][j] == true)
{
ans++;
temp.x = i;
temp.y = j;
bfs_CheckSurrounding(temp);
}
}
}
cout << ans;
system("pause");
return 0;
}