DFS + Número máximo de subgrafos conectados 200. Número de islas + 130. Área rodeada

200. Número de islas

Proporcione una cuadrícula bidimensional compuesta de '1' (tierra) y '0' (agua), cuente el número de islas en la cuadrícula.

Las islas siempre están rodeadas de agua, y cada isla solo puede estar formada por conexiones terrestres adyacentes horizontales y / o verticales.

Además, puede suponer que los cuatro lados de la cuadrícula están rodeados de agua.

Ejemplo 1:

Ingrese:

11110
11010
11000
00000
输出: 1

Ejemplo 2

Ingrese:

11000
11000
00100
00011


输出: 3

Explicación: Cada isla solo se puede formar conectando tierras adyacentes en direcciones horizontales y / o verticales.

Fuente: LeetCode (LeetCode)
Enlace: https://leetcode-cn.com/problems/number-of-islands El
copyright pertenece a la red de deducción. Comuníquese con la autorización oficial para la reimpresión comercial e indique la fuente de la reimpresión no comercial.


Resolución de problemas El primer recorrido en profundidad de cada subgrafo, marcado como llamado, llamando a DFS varias veces indica que hay varios subgrafos

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        //计算最大连通子图的数量
        for(int i=0;i<grid.size();i++)
            for(int j=0;j<grid[i].size();j++)
                if(grid[i][j]=='1')
                {
                    DFS(grid,i,j);
                    count++;
                }
        return count;
    }

private:
    int count=0;
    int xy[4][2]={{1,0},{-1,0},{0,1},{0,-1}};

    void DFS(vector<vector<char>> &grid,int x,int y)
    {   
        grid[x][y]='0';    //标记此点已遍历
        
        for(int i=0;i<4;i++)
        {
            int  x1=x+xy[i][0];
            int  y1=y+xy[i][1];
            if(x1>=0&&x1<grid.size()&&y1>=0&&y1<grid[x1].size()&& grid[x1][y1]=='1')      
                        DFS(grid,x1,y1);
        }

    }
};

130. Área rodeada

Dada una matriz bidimensional, contiene 'X' y 'O' (letra O).

Encuentre todas las áreas rodeadas por 'X' y llene todas las 'O' en estas áreas con 'X'.

Ejemplo:

X X X X
X O O X
X X O X
X O X X

Después de ejecutar su función, la matriz se convierte en:

X X X X
X X X X
X X X X
X O X X

Explicación

El intervalo incluido no existirá en el límite, en otras palabras, cualquier 'O' en el límite no se rellenará con 'X'. Cualquier 'O' que no esté en el límite o que no esté conectada a la 'O' en el límite eventualmente se llenará con 'X'. Si dos elementos son adyacentes en dirección horizontal o vertical, se dice que están "conectados".

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/suritated-regions Los
derechos de autor pertenecen a la red de deducción. Comuníquese con la autorización oficial para la reimpresión comercial e indique la fuente de la reimpresión no comercial.

Resuelva el problema
Primero recorra las subgrafías conectadas con 'O' comenzando desde la periferia, y recorra todo el gráfico después de la grabación, la parte que se superpone con la anterior no cambia, y la parte que no se superpone cambia a 'X'

class Solution {
public:
    void solve(vector<vector<char>>& board) {

        if(board.size()==0) return;
        vector<vector<char>> tmp(board);
        for(int i=0;i<board.size();i++)
            {
                if(tmp[i][0]=='O')
                    DFS(tmp,i,0);
                if(tmp[i][tmp[i].size()-1]=='O')
                    DFS(tmp,i,tmp[i].size()-1);
            }                
        for(int i=0;i<board[0].size();i++){  
                if(tmp[0][i]=='O')
                    DFS(tmp,0,i);
                if(tmp[tmp.size()-1][i]=='O')
                    DFS(tmp,tmp.size()-1,i);
        }
        for(int i=0;i<tmp.size();i++)
            for(int j=0;j<tmp[i].size();j++)
                if(tmp[i][j]=='O')
                    board[i][j]='X';
    }

private:
    //任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。
    //水平和垂直相连
    int xy[4][2]={{1,0},{-1,0},{0,1},{0,-1}};

    void DFS(vector<vector<char>> &tmp,int x,int y)
    {
        tmp[x][y]='X';

        for(int i=0;i<4;i++)
        {
            int x1=x+xy[i][0],y1=y+xy[i][1];
            if(x1>=0&&x1<tmp.size()&&y1>=0&&y1<tmp[x1].size()&&tmp[x1][y1]=='O')
                DFS(tmp,x1,y1);
        }
    }    
};
Publicados 105 artículos originales · ganado elogios 6 · vistas 4936

Supongo que te gusta

Origin blog.csdn.net/BLUEsang/article/details/105632768
Recomendado
Clasificación