AcWing 1233. 全球变暖 解题思路及代码

先贴个题目:

 以及原题链接:1233. 全球变暖 - AcWing题库icon-default.png?t=N7T8https://www.acwing.com/problem/content/1235/

 flood fill 算法,和AcWing 1113. 红与黑 解题思路及代码-CSDN博客差不多,但我之前刚开始的思路是先搜索一遍岛屿数量,然后把海平面上升后的地图表示出来然后再搜一遍,二者相减就是最终答案,代码如下:

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;typedef pair<int, int> PII;
#define x first
#define y secondconst int N = 1010;int n;
char map[N][N];
bool sign[N][N];
int dx[4] = {0, 0, -1, 1}, dy[4] = {1, -1, 0, 0};void bfs(int x, int y)
{PII start = make_pair(x, y);sign[x][y] = true;queue<PII> q;q.push(start);while(q.size()){PII tmp = q.front();q.pop();for (int i = 0; i < 4;++i){int tx = tmp.x + dx[i];int ty = tmp.y + dy[i];if(tx<0||tx>=n||ty<0||ty>=n)continue;if(!sign[tx][ty]&&map[tx][ty]=='#'){sign[tx][ty] = true;q.push(make_pair(tx, ty));}}}
}int main()
{cin >> n;for (int i = 0; i < n; ++i)scanf("%s", map[i]);int before = 0, now = 0;for (int i = 0; i < n; ++i) // 搜索原先的岛屿数for (int j = 0; j < n; ++j){if (map[i][j] == '#' && !sign[i][j]){before++;bfs(i, j);}}for (int i = 0; i < n; ++i) // 模拟海平面上升后的岛屿情况for (int j = 0; j < n; ++j){if (map[i][j] == '#'){for (int k = 0; k < 4; ++k){int tx = i + dx[k];int ty = j + dy[k];if (tx < 0 || tx >= n || ty < 0 || ty >= n)continue;if (map[tx][ty] == '.'){map[i][j] = '*';break;}}}}memset(sign, 0, sizeof(sign)); // 重置标记for (int i = 0; i < n; ++i)    // 搜索海平面上升后的岛屿数for (int j = 0; j < n; ++j){if (map[i][j] == '#' && !sign[i][j]){now++;bfs(i, j);}}cout << before - now;return 0;
}

然后发现如果出现:

9
.........
.##.##...
.#####...
.##.##...
.........
.##.#....
.#.###...
.#..#....
.........

这种情况,就会出现错误,错误原因是原来上面那个大岛在被淹没后会变成两个小岛,导致计数出问题,所以不行,于是我就换了个思路,搜索四周没有海域的地块,如果一整块大陆都没有,就让被淹没的岛屿数加一,然后ac了,写了两个版本,bfs和dfs的。

先贴个bfs的:

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;typedef pair<int, int> PII;
#define x first
#define y secondconst int N = 1010;int n;
char map[N][N];
bool sign[N][N];
int dx[4] = {0, 0, -1, 1}, dy[4] = {1, -1, 0, 0};bool bfs(int x, int y)
{bool sign1 = true;PII start = make_pair(x, y);sign[x][y] = true;queue<PII> q;q.push(start);while (q.size()){int cnt = 0;PII tmp = q.front();q.pop();for (int i = 0; i < 4; ++i){int tx = tmp.x + dx[i];int ty = tmp.y + dy[i];if (tx < 0 || tx >= n || ty < 0 || ty >= n)continue;if (!sign[tx][ty] && map[tx][ty] == '#'){sign[tx][ty] = true;q.push(make_pair(tx, ty));}if (map[tx][ty] == '.')cnt++;}if (!cnt)sign1 = false;}return sign1;
}int main()
{cin >> n;for (int i = 0; i < n; ++i)scanf("%s", map[i]);int ans = 0;for (int i = 0; i < n; ++i)for (int j = 0; j < n; ++j){if (map[i][j] == '#' && !sign[i][j]){if (bfs(i, j))ans++;}}cout << ans;return 0;
}

再贴个dfs的:

#include <iostream>
using namespace std;const int N = 1010;int n;
char map[N][N];
bool sign[N][N];
int dx[4] = {0, 0, -1, 1}, dy[4] = {-1, 1, 0, 0};bool dfs(int x, int y)
{bool sign1 = false, sign2 = false;int cnt = 0;for (int i = 0; i < 4; ++i){int tx = x + dx[i];int ty = y + dy[i];if (tx < 0 || tx >= n || ty < 0 || ty >= n)continue;if (map[tx][ty] == '#' && !sign[tx][ty]){sign[tx][ty] = true;sign2 = dfs(tx, ty);sign1 = sign1 || sign2;}if (map[tx][ty] == '.')cnt++;}if (!cnt)sign1 = true;return sign1;
}int main()
{cin >> n;for (int i = 0; i < n; ++i)scanf("%s", map[i]);int ans = 0;for (int i = 0; i < n; ++i)for (int j = 0; j < n; ++j){if (map[i][j] == '#' && !sign[i][j]){sign[i][j] = true;if (!dfs(i, j))ans++;}}cout << ans;return 0;
}

 by————2024.4.7刷题记录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/601951.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RFID涉密载体柜 RFID智能文件柜系统

涉密载体管控RFID智能柜&#xff08;载体柜DW-G101R&#xff09;通过对涉密物资、设备进行RFID唯一标识并放置于RFID设备涉密物资柜柜体&#xff0c;通过定位每台设备每件涉密物资的位置&#xff0c;实现涉密物资审批、自助借还、防盗等出入库全流程自动化管理。主要管理对象移…

Day17_学点JavaEE_转发、重定向、Get、POST、乱码问题总结

1 转发 转发&#xff1a;一般查询了数据之后&#xff0c;转发到一个jsp页面进行展示 req.setAttribute("list", list); req.getRequestDispatcher("student_list.jsp").forward(req, resp);2 重定向 重定向&#xff1a;一般添加、删除、修改之后重定向到…

【C++ STL有序关联容器】set 集合

文章目录 【 1. 基本原理 】【 2. set 的定义 】2.1 调用默认构造函数&#xff0c;创建空的 set 容器2.2 在创建 set 容器的同时&#xff0c;对其进行初始化2.3 拷贝构造的方式创建2.4 取已有 set 容器中的部分元素&#xff0c;来初始化新 set 容器2.5 修改排序规则的方式创建 …

鸿蒙Native输出so动态库,并提供给第三方导入使用

前言&#xff1a; DevEco Studio版本&#xff1a;4.0.0.600 API:9 最近在学习鸿蒙的Native输出so动态库&#xff0c;下面就给大家分享下我的学习心得及在实现过程中遇到的问题。 实现需求&#xff1a;通过so库输出文本内容 “你好&#xff0c;鸿蒙&#xff01;” 参考资料…

计算机网络基础(一)

目录 一.互联网和因特网 二.因特网的发展历程 三.因特网的功能 3.1边缘部分 3.1.1&#xff1a;客户服务器方式&#xff08;C/S方式&#xff09; 3.1.2&#xff1a;对等方式 3.2.核心部分 3.2.1&#xff1a;电路交换 3.2.2.报文交换 3.2.3&#xff1a;分组交换 四.计…

matlab学习001-简单的矩阵输入及绘制信号曲线

目录 1&#xff0c;熟悉简单的矩阵输入 1.1&#xff0c;创建矩阵 1.2&#xff0c;在命令行调用文件中的变量 1.3&#xff0c;ones函数 1.4&#xff0c;who和whos的使用 2&#xff0c;绘制信号曲线 2.1&#xff0c;实指数信号 2.2&#xff0c;频率为50Hz的周期方波信号…

红米K60更换后摄镜片

红米K60更换后摄镜片 拆后盖&#xff1a; 热风枪80加热后盖四周边缘&#xff0c;摸起来烫手即可&#xff0c;用刀片翘起后盖 注意&#xff1a;要从上下边缘翘&#xff0c;不要伤到侧键排线&#xff0c;侧键排线在左侧边缘靠上的位置&#xff08;手机屏幕朝下&#xff09;&…

CKA 基础操作教程(二)

Kubernetes Deployment 理论学习 Kubernetes Deployment &#xff08;部署&#xff09;是一种 Kubernetes 资源对象&#xff0c;用于定义和管理容器化应用程序的部署和更新。Deployment 提供了一种声明性的方式来定义应用程序的期望状态&#xff0c;并负责确保所需数量的 Pod…

【计算机毕业设计】校园论坛系统——后附系统源码

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…

Open CASCADE学习|平面上的PCurve

曲面上的曲线PCurve&#xff0c;字面上理解即为参数曲线(Parametric Curve)。在几何建模中&#xff0c;PCurve通常被描述为附加在参数曲面之间公共边上的数据结构。从更具体的定义来看&#xff0c;当给定一个曲面方程&#xff0c;并且其参数u和v是另一个参数t的函数时&#xff…

第8章 数据集成和互操作

思维导图 8.1 引言 数据集成和互操作(DII)描述了数据在不同数据存储、应用程序和组织这三者内部和之间进行移动和整合的相关过程。数据集成是将数据整合成物理的或虚拟的一致格式。数据互操作是多个系统之间进行通信的能力。数据集成和互操作的解决方案提供了大多数组织所依赖的…

Dubbo 服务发现

Dubbo 服务发现 1、什么是服务发现 **服务发现&#xff08;Service discovery&#xff09;**是自动检测一个计算机网络内的设备及其提供的服务。 2、Dubbo 与 服务发现 Dubbo 提供的是一种 Client-Based 的服务发现机制&#xff0c;依赖第三方注册中心组件来协调服务发现过…