算法训练营day65-岛屿连同问题

深搜-岛屿:99. 岛屿数量 (kamacoder.com)

// 深度搜索 dfs
#include<bits/stdc++.h>

using namespace std;

int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};

void dfs(vector<vector<int>>& map, vector<vector<bool>>& findednode, int newx, int newy) {
    if(map[newx][newy] == 0 || findednode[newx][newy] == true) return;
    findednode[newx][newy] = true;
    for(int i = 0;i < 4;i++) {
        int nextx = newx + dir[i][0];
        int nexty = newy + dir[i][1];
        if(nextx < 0 || nextx >= map.size() || nexty < 0 || nexty >= map[0].size()) continue;
        dfs(map, findednode, nextx, nexty);
    }
}
 
int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> map(n, vector<int>(m));
    for(int i = 0;i < n;i++) {
        for(int j = 0;j < m;j++) {
            cin >> map[i][j];
        }
    }
    int result = 0;
    vector<vector<bool>> findednode(n, vector<bool>(m, false));
    for(int i = 0;i < n;i++) {
        for(int j = 0;j < m;j++) {
            if(map[i][j] == 1 && findednode[i][j] == false) {
                result++;
                dfs(map, findednode, i, j);
            }
        }
    }
    cout << result << endl;
    return 0;
}

// 深度搜索 dfs 递归终止条件写在for里面了
#include<bits/stdc++.h>

using namespace std;

int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};

void dfs(vector<vector<int>>& map, vector<vector<bool>>& findednode, int newx, int newy) {
    findednode[newx][newy] = true;
    for(int i = 0;i < 4;i++) {
        int nextx = newx + dir[i][0];
        int nexty = newy + dir[i][1];
        if(nextx < 0 || nextx >= map.size() || nexty < 0 || nexty >= map[0].size()) continue;
        if(findednode[nextx][nexty] != true && map[nextx][nexty] == 1) {
            dfs(map, findednode, nextx, nexty);
        }
        
    }
}
 
int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> map(n, vector<int>(m));
    for(int i = 0;i < n;i++) {
        for(int j = 0;j < m;j++) {
            cin >> map[i][j];
        }
    }
    int result = 0;
    vector<vector<bool>> findednode(n, vector<bool>(m, false));
    for(int i = 0;i < n;i++) {
        for(int j = 0;j < m;j++) {
            if(map[i][j] == 1 && findednode[i][j] == false) {
                result++;
                dfs(map, findednode, i, j);
            }
        }
    }
    cout << result << endl;
    return 0;
}

广搜-岛屿:99. 岛屿数量 (kamacoder.com)

// 深度搜索 dfs
#include<bits/stdc++.h>

using namespace std;

int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};

void bfs(vector<vector<int>>& map, vector<vector<bool>>& findednode, int newx, int newy) {
    queue<pair<int, int>> qu;
    qu.push(pair<int,int>(newx, newy));
    findednode[newx][newy] = true;
    while(!qu.empty()) {
        pair<int, int>cur = qu.front();
        qu.pop();
        int x = cur.first;
        int y = cur.second;
        for(int i = 0;i < 4;i++) {
            int nextx = x + dir[i][0];
            int nexty = y + dir[i][1];
            if(nextx < 0 || nextx >= map.size() || nexty < 0 || nexty >= map[0].size()) continue;
            if(findednode[nextx][nexty] != true && map[nextx][nexty] == 1) {
                qu.push(pair<int, int>(nextx, nexty));
                findednode[nextx][nexty] = true;
            }
        }
    }
}
 
int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> map(n, vector<int>(m));
    for(int i = 0;i < n;i++) {
        for(int j = 0;j < m;j++) {
            cin >> map[i][j];
        }
    }
    int result = 0;
    vector<vector<bool>> findednode(n, vector<bool>(m, false));
    for(int i = 0;i < n;i++) {
        for(int j = 0;j < m;j++) {
            if(map[i][j] == 1 && findednode[i][j] == false) {
                result++;
                bfs(map, findednode, i, j);
            }
        }
    }
    cout << result << endl;
    return 0;
}

题目:100. 岛屿的最大面积 (kamacoder.com)

#include<bits/stdc++.h>

using namespace std;
int size = 0;
int dir[4][2] = {0,-1,-1,0,0,1,1,0};

void bfs(vector<vector<int>>& map, vector<vector<bool>>& visited, int x, int y) {
    queue<pair<int, int>> qu;
    qu.push(pair<int, int>(x, y));
    visited[x][y] = true;
    while(!qu.empty()) {
        size++;
        pair<int, int> cur = qu.front();
        qu.pop();
        int newx = cur.first;
        int newy = cur.second;
        for(int i = 0;i < 4;i++) {
            int nextx = newx + dir[i][0];
            int nexty = newy + dir[i][1];
            if(nextx < 0 || nextx >= map.size() || nexty < 0 || nexty >= map[0].size()) continue;
            if(!visited[nextx][nexty] && map[nextx][nexty] == 1) {
                visited[nextx][nexty] = true;
                qu.push(pair<int, int>(nextx, nexty));
            }
        }
    }
}

int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> map(n, vector<int>(m , 0));
    for(int i = 0;i < n;i++) {
        for(int j = 0;j < m;j++) {
            cin >> map[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(map[i][j] == 1 && !visited[i][j]) {
                size = 0;
                bfs(map, visited, i, j);
                result = max(result, size);
            }
        }
    }
    cout << result << endl;
    return 0;
}
相关推荐
天乐敲代码14 分钟前
JAVASE入门九脚-集合框架ArrayList,LinkedList,HashSet,TreeSet,迭代
java·开发语言·算法
十年一梦实验室18 分钟前
【Eigen教程】矩阵、数组和向量类(二)
线性代数·算法·矩阵
Kent_J_Truman20 分钟前
【子矩阵——优先队列】
算法
快手技术2 小时前
KwaiCoder-23BA4-v1:以 1/30 的成本训练全尺寸 SOTA 代码续写大模型
算法·机器学习·开源
一只码代码的章鱼2 小时前
粒子群算法 笔记 数学建模
笔记·算法·数学建模·逻辑回归
小小小小关同学2 小时前
【JVM】垃圾收集器详解
java·jvm·算法
圆圆滚滚小企鹅。2 小时前
刷题笔记 贪心算法-1 贪心算法理论基础
笔记·算法·leetcode·贪心算法
Kacey Huang2 小时前
YOLOv1、YOLOv2、YOLOv3目标检测算法原理与实战第十三天|YOLOv3实战、安装Typora
人工智能·算法·yolo·目标检测·计算机视觉
eguid_13 小时前
JavaScript图像处理,常用图像边缘检测算法简单介绍说明
javascript·图像处理·算法·计算机视觉
带多刺的玫瑰3 小时前
Leecode刷题C语言之收集所有金币可获得的最大积分
算法·深度优先