1 条题解
-
0
文字教学
这道题是经典的Flood Fill问题,用DFS(深度优先搜索)解决:
- 遍历每个格子,若遇到未被访问过的水('W'),说明发现了一个新水塘,计数加1。
- 用DFS从该格子出发,向8个方向(上下左右+四个对角线)搜索,把所有连通的'W'都标记为已访问,避免重复计数。
- 遍历结束后,计数就是水塘的总数。
代码
#include <bits/stdc++.h> using namespace std; const int N = 105; char g[N][N]; bool vis[N][N]; int n, m, ans; // 8个方向的偏移量 int dx[8] = {-1, -1, -1, 0, 0, 1, 1, 1}; int dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1}; void dfs(int x, int y) { vis[x][y] = true; for (int i = 0; i < 8; ++i) { int nx = x + dx[i], ny = y + dy[i]; if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && g[nx][ny] == 'W' && !vis[nx][ny]) { dfs(nx, ny); } } } int main() { cin >> n >> m; for (int i = 1; i <= n; ++i) { cin >> (g[i] + 1); } for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { if (g[i][j] == 'W' && !vis[i][j]) { ans++; dfs(i, j); } } } cout << ans << endl; return 0; }
- 1
信息
- ID
- 584
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 7
- 已通过
- 2
- 上传者
京公网安备 11011102002149号