当前位置: 首页 > news >正文

4.15 代码随想录第四十四天打卡

99. 岛屿数量(深搜)

(1)题目描述:

(2)解题思路:

#include <iostream>
#include <vector>
using namespace std;int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向
void dfs(const vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y) {for (int i = 0; i < 4; i++) {int nextx = x + dir[i][0];int nexty = y + dir[i][1];if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;  // 越界了,直接跳过if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { // 没有访问过的 同时 是陆地的visited[nextx][nexty] = true;dfs(grid, visited, nextx, nexty);}}
}int main() {int n, m;cin >> n >> m;vector<vector<int>> grid(n, vector<int>(m, 0));for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cin >> grid[i][j];}}vector<vector<bool>> visited(n, vector<bool>(m, false));int result = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (!visited[i][j] && grid[i][j] == 1) {visited[i][j] = true;result++; // 遇到没访问过的陆地,+1dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true}}}cout << result << endl;
}

(3)总结:

1.主要是深搜的过程如何将相邻的节点都标记为访问过的节点
2.这里终止条件就是dfs的if条件中相邻的是陆地并且要是没有访问过的陆地(访问过的陆地不可重复访问)

99. 岛屿数量(广搜)

(1)题目描述:

(2)解题思路:

#include <iostream>
#include <vector>
#include <queue>
using namespace std;int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向
void bfs(const vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y) {queue<pair<int, int>> que;que.push({x, y});visited[x][y] = true; // 只要加入队列,立刻标记while(!que.empty()) {pair<int ,int> cur = que.front(); que.pop();int curx = cur.first;int cury = cur.second;for (int i = 0; i < 4; i++) {int nextx = curx + dir[i][0];int nexty = cury + dir[i][1];if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;  // 越界了,直接跳过if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) {que.push({nextx, nexty});visited[nextx][nexty] = true; // 只要加入队列立刻标记}}}
}int main() {int n, m;cin >> n >> m;vector<vector<int>> grid(n, vector<int>(m, 0));for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cin >> grid[i][j];}}vector<vector<bool>> visited(n, vector<bool>(m, false));int result = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (!visited[i][j] && grid[i][j] == 1) {result++; // 遇到没访问过的陆地,+1bfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true}}}cout << result << endl;
}

(3)总结:

1、每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
2、遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。在遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。
3、加入队列就代表走过,就需要标记

100. 岛屿的最大面积

(1)题目描述:

(2)解题思路:

// 版本一
#include <iostream>
#include <vector>
using namespace std;
int count;
int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向
void dfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y) {for (int i = 0; i < 4; i++) {int nextx = x + dir[i][0];int nexty = y + dir[i][1];if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;  // 越界了,直接跳过if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { // 没有访问过的 同时 是陆地的visited[nextx][nexty] = true;count++;dfs(grid, visited, nextx, nexty);}}
}int main() {int n, m;cin >> n >> m;vector<vector<int>> grid(n, vector<int>(m, 0));for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cin >> grid[i][j];}}vector<vector<bool>> visited(n, vector<bool>(m, false));int result = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (!visited[i][j] && grid[i][j] == 1) {count = 1;  // 因为dfs处理下一个节点,所以这里遇到陆地了就先计数,dfs处理接下来的相邻陆地visited[i][j] = true;dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 trueresult = max(result, count);}}}cout << result << endl;}

(3)总结:

1.上一题的变形,此时计数器统计的是每一个岛屿中1的个数,因此需要放置在dfs中计数

相关文章:

  • Beyond Compare:多平台文件对比工具
  • 零售业如何数字化转型
  • 数据分析实战案例:使用 Pandas 和 Matplotlib 进行居民用水
  • 设计模式:状态模式 - 复杂状态切换的优雅之道
  • Golang|select
  • 3. Framer Motion 中 motion 组件
  • 【目标检测】【YOLO综述】YOLOv1到YOLOv10:最快速、最精准的实时目标检测系统
  • Flutter 播放利器:`media_kit` 的详细介绍与使用指南
  • 在GitHub action中使用添加项目中配置文件的值为环境变量
  • Apache Kafka UI :一款功能丰富且美观的 Kafka 开源管理平台!!
  • Golang|Kafka在秒杀场景中的应用
  • day29图像处理OpenCV
  • gitlab如何查看分支的创建时间
  • tomcat http 怎么改成 https
  • 如何安全地管理固定功能设备?
  • STM32移植文件系统FATFS——片外SPI FLASH
  • 房天下平台API接口开发指南
  • Android12 自定义系统服务
  • Cython中操作C++字符串
  • BLUE-ANT 静电防护
  • 一代名伶程砚秋经典影像:一箱旧影,芳华满堂
  • 国铁集团:5月1日全国铁路预计发送旅客2250万人次
  • 超越梅罗,这样一个亚马尔折射巴萨的容错率
  • 马克思主义理论研究教学名师系列访谈|丁晓强:马克思主义学者要更关注社会现实的需要
  • 车展之战:国产狂飙、外资反扑、智驾变辅助
  • 现场聆听总书记讲话,“00后”博士和大模型CEO都“热血沸腾”