题目描述
由于最近的降雨,水在农夫约翰的田地里积聚了。田地可以表示为一个 N×MN \\times MN×M 的矩形(1≤N≤1001 \\leq N \\leq 1001≤N≤100;1≤M≤1001 \\leq M \\leq 1001≤M≤100)。每个方格中要么是水(W),要么是干地(.)。农夫约翰想要弄清楚他的田地里形成了多少个水塘。一个水塘是由连通的水方格组成的,其中一个方格被认为与它的八个邻居相邻。给定农夫约翰田地的示意图,确定他有多少个水塘。
输入格式
第 111 行:两个用空格分隔的整数:NNN 和 MMM。
第 222 行到第 N+1N+1N+1 行:每行 MMM 个字符,表示农夫约翰田地的一行。
每个字符要么是 W,要么是 .。
字符之间没有空格。
输出格式
第 111 行:农夫约翰田地中的水塘数量。
输入输出样例 #1
输入 #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.
输出 #1
3
说明/提示
输出详情:共有三个水塘:一个在左上角,一个在左下角,还有一个沿着右侧。
(由 ChatGPT 4o 翻译)
solution
思路:用 dfs 搜索 W 以及周围四个方向的 W,独立搜索(即不是从其它W递归搜索)次数就是水塘水量
代码
#include <sstream>
#include "iostream"
#include "math.h"
#include "algorithm"
#include "string.h"
#include "unordered_set"
#include "deque"
#include "stack"
#include "queue"
#include "vector"
#include "unordered_map"
using namespace std;
char c[100][100];
bool vis[100][100];
int n, m;
int dx[8] = {–1, –1, –1, 0, 0, 1, 1, 1};
int dy[8] = {–1, 0, 1, –1, 1, –1, 0, 1};
void f(int i, int j) {
vis[i][j] = 1;
for (int k = 0; k < 8; k++) {
if (i + dx[k] >= 0 && i + dx[k] < n && j + dy[k] >= 0 && j + dy[k] <= m && !vis[i + dx[k]][j + dy[k]] && c[i + dx[k]][j + dy[k]] == 'W') {
f(i + dx[k], j + dy[k]);
}
}
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) cin >> c[i][j];
int s = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (!vis[i][j] && c[i][j] == 'W') {
s++;
f(i, j);
}
cout << s;
return 0;
}
评论前必须登录!
注册