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

代码随想录 99. 岛屿数量

99. 岛屿数量

#include<bits/stdc++.h>
using namespace std;
 
void dfs(vector<vector<int>>& mp, vector<vector<int>>& visit, int y, int x){
    if (visit[y][x] == 1 || mp[y][x] == 0) return;
    visit[y][x] = 1;
    if (y > 0) dfs(mp, visit, y - 1, x);
    if (x > 0) dfs(mp, visit, y, x - 1);
    if (y < mp.size() - 1) dfs(mp, visit, y + 1, x);
    if (x < mp[0].size() - 1) dfs(mp, visit, y, x + 1);
}
 
int main(){
    int n, m;
    cin >> n >> m;
    vector<vector<int>> mp(n, vector<int>(m, 0));
    vector<vector<int>> visit(n, vector<int>(m,0));
    int result = 0;
     
    for (int i = 0; i < n; i++){
        for (int j = 0; j < m; j++){
            cin >> mp[i][j];
        }
    }
    for (int i = 0; i < n; i++){
        for (int j = 0; j < m; j++){
            if (mp[i][j] == 1 && visit[i][j] == 0){
                result++;
                dfs(mp, visit, i, j);
            }
        }
    }
    cout << result;
    return 0;
}

这是dfs的版本,其实就是在遇到一个没访问过的1时,就将所有能和这个1组成一个岛的1全部设为异界访问过,dfs与bfs只是采取两种遍历岛内元素的方法

#include<bits/stdc++.h>
using namespace std;
 
void bfs(vector<vector<int>>& mp, vector<vector<int>>& visit, int y, int x){
    queue<pair<int, int>> q;
    q.push({y, x});
    visit[y][x] = 1;
    while(!q.empty()){
        pair<int, int> tmp = q.front();
        int tmpy = tmp.first, tmpx = tmp.second;
        q.pop();
        if (tmpy > 0){
            if (visit[tmpy - 1][tmpx] == 0 && mp[tmpy - 1][tmpx] == 1){
                q.push({tmpy - 1, tmpx});
                visit[tmpy - 1][tmpx] = 1;
            }
        }
        if (tmpx > 0){
            if (visit[tmpy][tmpx - 1] == 0 && mp[tmpy][tmpx - 1] == 1){
                q.push({tmpy, tmpx - 1});
                visit[tmpy][tmpx - 1] = 1;
            }
        }
        if (tmpy < mp.size() - 1){
            if (visit[tmpy + 1][tmpx] == 0 && mp[tmpy + 1][tmpx] == 1){
                q.push({tmpy + 1, tmpx});
                visit[tmpy + 1][tmpx] = 1;
            }
        }
        if (tmpx < mp[0].size() - 1){
            if (visit[tmpy][tmpx + 1] == 0 && mp[tmpy][tmpx + 1] == 1){
                q.push({tmpy, tmpx + 1});
                visit[tmpy][tmpx + 1] = 1;
            }
        }
    }
}
 
int main(){
    int n, m;
    cin >> n >> m;
    vector<vector<int>> mp(n, vector<int>(m, 0));
    vector<vector<int>> visit(n, vector<int>(m,0));
    int result = 0;
     
    for (int i = 0; i < n; i++){
        for (int j = 0; j < m; j++){
            cin >> mp[i][j];
        }
    }
    for (int i = 0; i < n; i++){
        for (int j = 0; j < m; j++){
            if (mp[i][j] == 1 && visit[i][j] == 0){
                result++;
                bfs(mp, visit, i, j);
            }
        }
    }
    cout << result;
    return 0;
}

这是bfs的版本,需要强调的是,标注已访问需要在入队时就标注,出队时标注仍然会有重复访问导致超时的可能。

代码随想录 99. 岛屿数量


http://www.kler.cn/news/332858.html

相关文章:

  • Studying-多线程学习Part2 - 互斥量死锁、lock_guard 与 unique_lock、call_once与其使用场景
  • Git介绍--github/gitee/gitlab使用
  • VMware tools菜单为灰色无法安装
  • 【MySQL 08】复合查询
  • 51单片机——矩阵键盘
  • 整理Maven坐标,Spring Boot集成工具依赖版本差异问题
  • JAVA基础语法 Day11
  • Pikachu-RCE-exec“ping“
  • 简单易懂的springboot整合Camunda 7工作流入门教程
  • 数据看板如何提升决策效率?
  • 订阅ROS2中相机的相关话题并保存RGB、深度和点云图
  • 【网络】web1.0 2.0 3.0各自出现背景/技术原理/演化发展过程,以及Web 3.0 对传统互联网的影响
  • 通信工程学习:什么是ICMP因特网控制报文协议
  • 一块1T硬盘怎么有sdb1和sdb2
  • 在线css像素Px到百分比(%)换算器
  • 22.2 k8s中ksm采集的使用的dns解析
  • 【Kubernetes】常见面试题汇总(五十三)
  • Elasticsearch学习记录
  • 【hot100-java】[单词拆分]
  • 案例-猜数字游戏