day-63 代码随想录算法训练营(19) 图论 part 02

1020.飞地的数量

分析:求不跟边界接壤的陆地的数量
思路一:深度优先遍历
  • 先从四个侧边找陆地,然后进行深度优先遍历,把所有接壤的陆地(1)全部转换成海洋(0)
    • 深度优先遍历:从四个方向进行递归遍历
  • 遍历整个图,统计所有陆地的数量。
class Solution {
public:
    int direct[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
    int res=0;
    void dfs(vector>&grid,int x,int y){
        grid[x][y]=0;
        for(int i=0;i<4;i++){
            int nextx=x+direct[i][0];
            int nexty=y+direct[i][1];
            if(nextx>=0 && nextx=0 && nexty>& grid) {
        int n=grid.size(),m=grid[0].size();
        for(int i=0;i

130.被围绕的区域

思路一:dfs
  • 依然是从四个侧面把陆地深度优先遍历,然后改成 A 字符
  • 然后遍历整个图,把剩余的陆地(必然被海水包裹)变为海水,A 字符变为陆地
class Solution {
public:
    int direct[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
    int res=0;
    void dfs(vector>&board,char target,int x,int y)
    {
        board[x][y]=target;
        res++;
        for(int i=0;i<4;i++){
            int nextx=x+direct[i][0];
            int nexty=y+direct[i][1];
            if(nextx>=0 && nextx=0 && nexty>& board) {

        int n=board.size(),m=board[0].size();
        for(int i=0;i

417.太平洋大西洋流水问题

思路一:深度优先遍历
  • 分别从大西洋和太平洋一侧,倒着推得到两个数组
  • 当两个数组都经过同一位置时,说明可以流向两边
class Solution {
public:
    int direct[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
    void dfs(vector>&heights,vector>&visted,int x,int y){
        if(visted[x][y]) return;
        visted[x][y]=true;
        for(int i=0;i<4;i++){
            int nextx=x+direct[i][0];
            int nexty=y+direct[i][1];
            if(nextx>=0 && nextx=0 && nexty> pacificAtlantic(vector>& heights) {
        int n=heights.size(),m=heights[0].size();
        vector>res;

        vector>pacific(n,vector(m,false));//太平洋
        vector>atlantic(n,vector(m,false));//大西洋

        for(int i=0;i

你可能感兴趣的:(#,代码随想录算法训练营(19),算法,图论,深度优先)