云计算百科
云计算领域专业知识百科平台

洛谷 P1596 [USACO10OCT] Lake Counting S-普及-

题目描述

由于最近的降雨,水在农夫约翰的田地里积聚了。田地可以表示为一个 N×MN \\times MN×M 的矩形(1≤N≤1001 \\leq N \\leq 1001N1001≤M≤1001 \\leq M \\leq 1001M100)。每个方格中要么是水(W),要么是干地(.)。农夫约翰想要弄清楚他的田地里形成了多少个水塘。一个水塘是由连通的水方格组成的,其中一个方格被认为与它的八个邻居相邻。给定农夫约翰田地的示意图,确定他有多少个水塘。

输入格式

111 行:两个用空格分隔的整数:NNNMMM

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;
}

结果

在这里插入图片描述

赞(0)
未经允许不得转载:网硕互联帮助中心 » 洛谷 P1596 [USACO10OCT] Lake Counting S-普及-
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!