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);
}
}
};