P1596 [USACO10OCT] Lake Counting S
·
P1596 [USACO10OCT] Lake Counting S
题目描述
由于最近的降雨,水在农夫约翰的田地里积聚了。田地可以表示为一个 N × M N \times M N×M 的矩形( 1 ≤ N ≤ 100 1 \leq N \leq 100 1≤N≤100; 1 ≤ M ≤ 100 1 \leq M \leq 100 1≤M≤100)。每个方格中要么是水(W),要么是干地(.)。农夫约翰想要弄清楚他的田地里形成了多少个水塘。一个水塘是由连通的水方格组成的,其中一个方格被认为与它的八个邻居相邻。给定农夫约翰田地的示意图,确定他有多少个水塘。
输入格式
第 1 1 1 行:两个用空格分隔的整数: N N N 和 M M M。
第 2 2 2 行到第 N + 1 N+1 N+1 行:每行 M M M 个字符,表示农夫约翰田地的一行。
每个字符要么是 W,要么是 .。
字符之间没有空格。
输出格式
第 1 1 1 行:农夫约翰田地中的水塘数量。
输入输出样例 #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 翻译)
解析
#include<iostream>
#include<vector>
using namespace std;
int n, m, ans;
vector<vector<char>> field;
vector<pair<int, int>> dir = {
{-1, 0},
{0, -1},
{1, 0},
{0, 1},
{-1, -1},
{-1, 1},
{1, -1},
{1, 1}
};// 八个方向
void dfs(int x, int y){
if(x < 0 || x >= n || y < 0 || y >= m || field[x][y] == '.') return;
// 将水池填充
field[x][y] = '.';
// 向八方继续遍历
for(int i = 0; i < dir.size(); i++){
dfs(x + dir[i].first, y + dir[i].second);
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n >> m;
field.resize(n, vector<char>(m));
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++) cin >> field[i][j];
}
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(field[i][j] == 'W'){
// 是洼地, 就DFS, 将周围水池全填充
ans++;
dfs(i, j);
}
}
}
cout << ans;
return 0;
}
更多推荐



所有评论(0)