图论第2天----第1020题、第130题

图论第2天----第1020题、第130题

文章目录

​ 又继续开始修行,把图论这块补上,估计要个5-6天时间。

一、第1020题--飞地的数量

​ 跟前面做的思路差不多,其实有另外一种思路。我这里是在遍历每块岛屿时,判断是否四周都是水,进而再统计数量。另一种思路,与130思路差不多,从边上开始遍历,要遍历2遍。

c++ 复制代码
class Solution {
public:
    int count;
    int result = 0;
    bool flag;
    int dir[4][2] = {0,1,1,0,0,-1,-1,0};

    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()){
                flag = true;
                continue;
            }
            if(!visited[nextx][nexty] && grid[nextx][nexty] == 1){
                visited[nextx][nexty] = true;
                count++;
                dfs(grid, visited, nextx, nexty);
            }
        }
    }

    int numEnclaves(vector<vector<int>>& grid) {
        int n = grid.size();
        int m = grid[0].size();
        vector<vector<bool>> visited(n, vector<bool>(m, false));
        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;
                    flag = false;
                    count = 1;
                    dfs(grid, visited, i, j);
                    cout << flag << ' ' << count << endl;
                    if (!flag) result += count;
                }
            }
        }
        return result;
    }
};

二、第130题--被围绕的区域

​ 遍历2遍。第一遍从边上开始遍历,把边上的岛屿做标记,记为'A'。这样边上的岛屿('A')与中间的岛屿('O')区分开了。第二遍遍历时,每个元素都遍历到,把'O'变为'X',把'A'变为'O',就把边上边上的岛屿留下了。

c++ 复制代码
class Solution {
public:
    int dir[4][2] = {0,1,1,0,0,-1,-1,0};
    void dfs(vector<vector<char>>& board, int x, int y){
        board[x][y] = 'A';
        for(int i=0; i<4; i++){
            int nextx = x + dir[i][0];
            int nexty = y + dir[i][1];
            if(nextx <0 || nexty <0 || nextx >=board.size() || nexty >=board[0].size()) continue;
            if(board[nextx][nexty] == 'X' || board[nextx][nexty] == 'A') continue;
            dfs(board, nextx, nexty);
        }
    }

    void solve(vector<vector<char>>& board) {
        int n = board.size();
        int m = board[0].size();
        for(int i=0; i<n; i++){
            if(board[i][0] == 'O') dfs(board, i, 0);
            if(board[i][m-1] == 'O') dfs(board, i, m-1);
        } 
        for(int j=0; j<m; j++){
            if(board[0][j] == 'O') dfs(board, 0, j);
            if(board[n-1][j] == 'O') dfs(board, n-1, j);
        }
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                if(board[i][j] == 'O') board[i][j] = 'X';
                if(board[i][j] == 'A') board[i][j] = 'O';
            }
        }
    }
};
相关推荐
CoovallyAIHub7 小时前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
NAGNIP8 小时前
Serverless 架构下的大模型框架落地实践
算法·架构
moonlifesudo8 小时前
半开区间和开区间的两个二分模版
算法
moonlifesudo8 小时前
300:最长递增子序列
算法
CoovallyAIHub13 小时前
港大&字节重磅发布DanceGRPO:突破视觉生成RLHF瓶颈,多项任务性能提升超180%!
深度学习·算法·计算机视觉
CoovallyAIHub14 小时前
英伟达ViPE重磅发布!解决3D感知难题,SLAM+深度学习完美融合(附带数据集下载地址)
深度学习·算法·计算机视觉
聚客AI1 天前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
大怪v1 天前
前端:人工智能?我也会啊!来个花活,😎😎😎“自动驾驶”整起!
前端·javascript·算法
惯导马工1 天前
【论文导读】ORB-SLAM3:An Accurate Open-Source Library for Visual, Visual-Inertial and
深度学习·算法
骑自行车的码农2 天前
【React用到的一些算法】游标和栈
算法·react.js