算法训练营day66-孤岛总面积-沉没孤岛-水流问题-建造最大岛屿

题目1:101. 孤岛的总面积 (kamacoder.com)

复制代码
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int dir[4][2] = {0,-1,-1,0,0,1,1,0};
int count = 0;
void bfs(vector<vector<int>>& map, vector<vector<bool>>& vistied, int x, int y, bool flag) {
    queue<pair<int, int>> qu;
    qu.push(pair<int, int>(x, y));
    vistied[x][y] = true;
    if(flag) map[x][y] = 0;
    else count++;
    while(!qu.empty()) {
        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(!vistied[nextx][nexty] && map[nextx][nexty] == 1) {
                vistied[nextx][nexty] = true;
                qu.push(pair<int, int>(nextx, nexty));
                if(flag) map[nextx][nexty] = 0;
                else count++;
            }
        }
    }
}

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]; 
        }
    }
    
    vector<vector<bool>> vistied(n, vector<bool>(m, false));
    for(int j = 0;j < m;j++) {
        if(map[0][j] == 1 && !vistied[0][j]) bfs(map, vistied, 0, j, true);
        if(map[n - 1][j] == 1 && !vistied[n - 1][j]) bfs(map, vistied, n - 1, j, true);
    }
    for(int i = 0;i < n;i++) {
        if(map[i][0] == 1 && !vistied[i][0]) bfs(map, vistied, i, 0, true);
        if(map[i][m - 1] == 1 && !vistied[i][m - 1]) bfs(map, vistied, i, m - 1, true);
    }

    for(int i = 0;i < n;i++) {
        for(int j = 0;j < m;j++) {
            if(!vistied[i][j] && map[i][j] == 1) {
                // if(i != 0 && i != n - 1 && j != 0 && j != m - 1) {
                //     result++;
                // }
                bfs(map,vistied,i,j, false);
            }
        }
    }
    cout << count << endl;
    return 0;
}

题目2:102. 沉没孤岛 (kamacoder.com)

复制代码
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int dir[4][2] = {0,-1,-1,0,0,1,1,0};

void bfs(vector<vector<int>>& map, vector<vector<bool>>& vistied, vector<vector<int>>& result, int x, int y, bool flag) {
    queue<pair<int, int>> qu;
    qu.push(pair<int, int>(x, y));
    vistied[x][y] = true;
    if(flag) map[x][y] = 0;
    else result[x][y] = 0;
    while(!qu.empty()) {
        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(!vistied[nextx][nexty] && map[nextx][nexty] == 1) {
                vistied[nextx][nexty] = true;
                qu.push(pair<int, int>(nextx, nexty));
                if(flag) map[nextx][nexty] = 0;
                else result[nextx][nexty] = 0;
            }
        }
    }
}

int main() {
    int n,m;
    cin >> n >> m;
    vector<vector<int>> map(n, vector<int>(m));
    vector<vector<int>> result(n, vector<int>(m));
    for(int i = 0;i < n;i++) {
        for(int j = 0;j < m;j++) {
            cin >> map[i][j];
            result[i][j] = map[i][j];
        }
    }
    
    vector<vector<bool>> vistied(n, vector<bool>(m, false));
    for(int j = 0;j < m;j++) {
        if(map[0][j] == 1 && !vistied[0][j]) bfs(map, vistied, result, 0, j, true);
        if(map[n - 1][j] == 1 && !vistied[n - 1][j]) bfs(map, vistied, result, n - 1, j, true);
    }
    for(int i = 0;i < n;i++) {
        if(map[i][0] == 1 && !vistied[i][0]) bfs(map, vistied, result, i, 0, true);
        if(map[i][m - 1] == 1 && !vistied[i][m - 1]) bfs(map, vistied, result, i, m - 1, true);
    }

    for(int i = 0;i < n;i++) {
        for(int j = 0;j < m;j++) {
            if(!vistied[i][j] && map[i][j] == 1) {
                bfs(map,vistied, result,i,j, false);
            }
        }
    }
    for(int i = 0;i < n;i++) {
        for(int j = 0;j < m - 1;j++) {
             cout << result[i][j] << ' ';
        }
        cout << result[i][m - 1] << endl;
    }
   
    return 0;
}

题目3:103. 水流问题 (kamacoder.com)

题目4:104. 建造最大岛屿 (kamacoder.com)

相关推荐
YuTaoShao6 小时前
【LeetCode 每日一题】1458. 两个子序列的最大点积——(解法三)状态压缩
算法·leetcode·职场和发展
位东风6 小时前
希尔排序(Shell Sort)详解
算法·排序算法
AI科技星7 小时前
光速飞行器动力学方程的第一性原理推导、验证与范式革命
数据结构·人工智能·线性代数·算法·机器学习·概率论
橘颂TA7 小时前
【剑斩OFFER】算法的暴力美学——leetCode 946 题:验证栈序列
c++·算法·leetcode·职场和发展·结构与算法
闻缺陷则喜何志丹7 小时前
【状态机动态规划】3686. 稳定子序列的数量|1969
c++·算法·动态规划·力扣·状态机动态规划
寻星探路7 小时前
【算法通关】双指针技巧深度解析:从基础到巅峰(Java 最优解)
java·开发语言·人工智能·python·算法·ai·指针
wen__xvn7 小时前
力扣第 484 场周赛
算法·leetcode·职场和发展
YuTaoShao7 小时前
【LeetCode 每日一题】865. 具有所有最深节点的最小子树——(解法一)自顶向下
算法·leetcode·职场和发展
寻星探路7 小时前
【算法专题】哈希表:从“两数之和”到“最长连续序列”的深度解析
java·数据结构·人工智能·python·算法·ai·散列表