P1596 [USACO10OCT] Lake Counting S 洛谷 -池塘计数

embedded/2024/12/28 1:13:02/

题目描述

Due to recent rains, water has pooled in various places in Farmer John's field, which is represented by a rectangle of N x M (1 <= N <= 100; 1 <= M <= 100) squares. Each square contains either water ('W') or dry land ('.'). Farmer John would like to figure out how many ponds have formed in his field. A pond is a connected set of squares with water in them, where a square is considered adjacent to all eight of its neighbors. Given a diagram of Farmer John's field, determine how many ponds he has.

输入格式

Line 1: Two space-separated integers: N and M * Lines 2..N+1: M characters per line representing one row of Farmer John's field. Each character is either 'W' or '.'. The characters do not have spaces between them.

输出格式

Line 1: The number of ponds in Farmer John's field.

题意翻译

由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个 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.

输出 #1复制

3

 递归dfs版

#include<iostream>
#include<cstring>
#include<algorithm>#define x first
#define y second
using namespace std;typedef pair<int,int> PII;int n, m; // 定义地图的行数和列数
const int N = 110, M = N * N; // 定义常量N和M,用于数组大小
char ans[N][N]; // 存储地图信息
PII q[M]; // 队列,用于广度优先搜索
bool ret[N][N]; // 记录每个位置是否已经被访问过
int num = 0; // 记录岛屿的数量// 定义八个方向的移动向量
int a[] = {-1, -1, 0, 1, 1, 1, 0, -1};
int b[] = {0, 1, 1, 1, 0, -1, -1, -1};// 广度优先搜索函数
void bfs(int i, int j) {ret[i][j] = true; // 标记当前位置为已访问for (int k = 0; k < 8; k++) {int x = i + a[k]; // 计算新位置的行坐标int y = j + b[k]; // 计算新位置的列坐标if (x >= 0 && x < n && y >= 0 && y < m && !ret[x][y] && ans[i][j] == 'W') {bfs(x, y); // 对新位置进行递归调用bfs}}
}int main() {scanf("%d %d", &n, &m); // 输入地图的行数和列数for (int i = 0; i < n; i++) scanf("%s", ans[i]); // 输入地图每一行的信息for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (ans[i][j] == 'W' && !ret[i][j]) { // 如果是未访问过的陆地bfs(i, j); // 调用bfs函数进行深度优先搜索num++; // 岛屿数量加一}}}cout << num << endl; // 输出岛屿的数量return 0;
}

bfs不会爆栈

#include<iostream>
#include<cstring>
#include<algorithm>#define x first
#define y second
using namespace std;typedef pair<int,int> PII;int n, m; // 定义地图的行数和列数
const int N = 110, M = N * N; // 定义常量N和M,用于数组大小
char ans[N][N]; // 存储地图信息
PII q[M]; // 队列,用于广度优先搜索
bool ret[N][N]; // 记录每个位置是否已经被访问过
int num = 0; // 记录岛屿的数量// 定义八个方向的移动向量
int a[] = {-1, -1, 0, 1, 1, 1, 0, -1};
int b[] = {0, 1, 1, 1, 0, -1, -1, -1};// 广度优先搜索函数
void bfs(int i, int j) {ret[i][j] = true; // 标记当前位置为已访问int hh = 0, tt = 0;q[tt++] = {i, j}; // 将起始位置加入队列while (hh < tt) {PII t = q[hh++]; // 取出队首元素for (int k = 0; k < 8; k++) {int x = t.x + a[k]; // 计算新位置的行坐标int y = t.y + b[k]; // 计算新位置的列坐标if (x >= 0 && x < n && y >= 0 && y < m && !ret[x][y] && ans[x][y] == 'W') {q[tt++] = {x, y}; // 将新位置加入队列ret[x][y] = true; // 标记新位置为已访问}}}
}int main() {scanf("%d %d", &n, &m); // 输入地图的行数和列数for (int i = 0; i < n; i++) scanf("%s", ans[i]); // 输入地图每一行的信息for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (ans[i][j] == 'W' && !ret[i][j]) { // 如果是未访问过的陆地bfs(i, j); // 调用bfs函数进行广度优先搜索num++; // 岛屿数量加一}}}cout << num << endl; // 输出岛屿的数量return 0;
}

 


http://www.ppmy.cn/embedded/148382.html

相关文章

传统网络架构与SDN架构对比

传统网络采用分布式控制&#xff0c;每台设备独立控制且管理耗时耗力&#xff0c;扩展困难&#xff0c;按 OSI 模型分层&#xff0c;成本高、业务部署慢、安全性欠佳且开放性不足。而 SDN 架构将控制平面集中到控制器&#xff0c;数据转发由交换机负责&#xff0c;可统一管理提…

BunkerWeb 开源项目安装与使用教程

BunkerWeb 开源项目安装与使用教程 bunkerweb ??? Make your web services secure by default ! [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/bu/bunkerweb 1. 项目的目录结构及介绍 BunkerWeb 项目的目录结构如下&#xff1a; bunkerweb/ ├── docs/ …

管理面板Ajenti的在Windows10下Ubuntu24.04/Ubuntu22.04里的安装

Ajenti是一款基于Web的开源系统管理控制面板&#xff0c;可用于通过Web浏览器&#xff0c;管理远程系统管理性任务&#xff0c;这一点与 Webmin模块 非常相似。 Ajenti是一款功能非常强大的轻型工具&#xff0c;它提供了快速的、反应灵敏的Web界面&#xff0c;可用于管理小型服…

LeetCode429周赛T4

最小化二进制字符串中最长相同子字符串的长度 在处理二进制字符串问题时&#xff0c;优化字符串结构以满足特定条件是一项常见的挑战。本文将探讨一个具体的问题&#xff1a;给定一个长度为 n 的二进制字符串 s 和一个整数 numOps&#xff0c;通过最多 numOps 次位翻转操作&am…

Qt笔记-Qt Creator开发环境搭建

背景 最近参与了一个新项目&#xff0c;与C相关的开发环境是VS2012Qt5.5.1等等。说句真实的&#xff0c;VS开发工具开发纯C/C的项目还是十分方便的&#xff0c;但如果是Qt项目&#xff0c;QtCreator感觉还是略胜一筹。所以准备单独搭建个QtCreator使得后期开发速度嘎嘎的快。 …

【C语言】代码BUG排查方式

【C语言】代码BUG排查方式 文章目录 [TOC](文章目录) 前言一、BUG复现二、printf三、仿真器断点调试1.清除所有断点2.进入调试模式3.打断点&#xff0c;执行 四、参考资料总结 前言 使用工具&#xff1a; 1.ARM仿真器/J-OBV2仿真器 提示&#xff1a;以下是本篇文章正文内容&am…

c# 不同数据类型转换

namespace Systempublic static class ConvertExtension {public static byte[] ToBinaryByteArray(this byte[] bytes){// 每个字节有 8 位&#xff0c;所以总位数为 bytes.Length * 8byte[] binaryArray new byte[bytes.Length * 8];int index 0;// 遍历每个字节foreach (b…

windows 钉钉缓存路径不能修改 默认C盘解决方案

1.问题背景 windows系统C盘被钉钉缓存占用大量空间&#xff0c;导致C盘存储严重不足&#xff1b;但钉钉不支持修改缓存路径 2.解决方案 为钉钉缓存路径创建软连接到其他目录 3.解决步骤 a.钉钉设置里找到&#xff0c;钉钉缓存路径 C:\Users\admin\AppData\Roaming\DingTalk …