代码随想录(番外)图论3|1020. 飞地的数量|130. 被围绕的区域

发布于:2024-04-29 ⋅ 阅读:(44) ⋅ 点赞:(0)

代码随想录(番外)图论3|1020. 飞地的数量|130. 被围绕的区域

1020. 飞地的数量

class Solution {
public:
    int dir[4][2]={0,1,1,0,0,-1,-1,0};
    int count;
    void dfs(vector<vector<int>>& grid,int x,int y)
    {
        grid[x][y]=0;
        count++;
        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>=grid.size()||nexty>=grid[0].size()) continue;
            if(grid[nextx][nexty]==0) continue;

            dfs(grid,nextx,nexty);
        }
        return;
    }
    int numEnclaves(vector<vector<int>>& grid) {
        int m=grid.size(),n=grid[0].size();
        
        for(int i=0;i<n;i++)
        {
            if(grid[0][i]==1) dfs(grid,0,i);
            if(grid[m-1][i]==1) dfs(grid,m-1,i);

        }

        for(int j=0;j<m;j++)
        {
            if(grid[j][0]==1) dfs(grid,j,0);
            if(grid[j][n-1]==1) dfs(grid,j,n-1);
        }

        count=0;

        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
            {
                if(grid[i][j]==1) dfs(grid,i,j);
            }
        
        return count;
    }
};
/*
本题是通过把四周的边界区域归0,然后最后遍历全部
之后可以得出图中飞地,但是要特别注意区域边界值问题,最后画图
确定边界范围,这样不容易出错。
*/

在这里插入图片描述

1021. 130. 被围绕的区域

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]=='A'||board[nextx][nexty]=='X') continue;

            dfs(board,nextx,nexty);
  
        }
    }
    void solve(vector<vector<char>>& board) {
        int m=board.size(),n=board[0].size();

        for(int i=0;i<m;i++)
        {
            if(board[i][0]=='O') dfs(board,i,0);
            if(board[i][n-1]=='O') dfs(board,i,n-1);

        }

        for(int j=0;j<n;j++)
        {
            if(board[0][j]=='O') dfs(board,0,j);
            if(board[m-1][j]=='O') dfs(board,m-1,j);            
        }

        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
            {
                if(board[i][j]=='O') board[i][j]='X';
                if(board[i][j]=='A') board[i][j]='O';

            }
    }
};

/*
其中算法还是比较巧妙的不用再定义一个二维数组来标记
一直出小错误,
1.边界,一定一定一定要在纸上画。
2.注意边界dfs遍历
恼火。
*/

在这里插入图片描述