Título:
Dê a você uma grade bidimensional composta por '1' (terra) e '0' (água); por favor, conte o número de ilhas na grade. As ilhas estão sempre cercadas por água e cada ilha só pode ser formada por conexões terrestres adjacentes horizontais e / ou verticais. Além disso, você pode assumir que todos os quatro lados da grade estão cercados por água.
Exemplos:
Digite:
11110
11010
11000
00000
Saída: 1
Fonte: LeetCode
Método 1: pesquisa profunda
Esse problema pode ser considerado como um problema de encontrar o valor do vizinho mais próximo. Em uma grade, os vizinhos mais próximos definidos aqui são para cima, para baixo, para a esquerda e para a direita. Em seguida, podemos percorrer a profundidade da mesma maneira que a árvore binária, assumindo que seja equivalente a uma "árvore quádrupla". Mas, dessa maneira, haverá repetições durante o processo de travessia, portanto, definimos todos os '1s encontrados' como '0' durante o processo de pesquisa profunda, para evitar repetições.
1 # 深度 搜索 2 class Solução (objeto): 3 def numIslands (auto, grade): 4 nums = 0 5 para i na faixa (len (grade)): 6 para j na faixa (len (grade [0])) : 7 se grade [i] [j] == ' 1 ' : 8 self.search_depth (grade, i, j) 9 nums + = 1 10 return nums 11 12 def search_depth (self, grade, x, y): 13 E sex> = len (grade) ou y> = len (grade [0]) ou x <0 ou y < 0: 14 retornam 15 16 se grade [x] [y] == ' 1 ' : 17 grade [x] [y] = ' 0 ' 18 self.search_depth (grade, x-1 , y) 19 self.search_depth (grade, x, y-1 ) 20 self.search_depth (grade, x + 1 , y) 21 self.search_depth (grade, x, y + 1 )
Método 2: pesquisa ampla
Ele pode ser resolvido por uma pesquisa profunda, mas o processo recursivo ocupará muita memória, para que possamos substituir o processo recursivo por uma lista. Quando passamos para um ponto, ele é '1' e se torna um ponto de ilha, então adicionamos os pontos de ilha vizinhos, ou seja, os pontos de '1' para cima, para baixo, esquerda e direita, em uma lista e, em seguida, continuamente a partir da lista Retire o ponto da ilha como o ponto central da ilha e adicione as ilhas vizinhas à lista novamente, até que a lista esteja vazia, o cálculo seja concluído. Isso substitui todo o processo recursivo por uma lista.
1 # 搜索 搜索 2 class Solução (objeto): 3 def numIslands (auto, grade): 4 nr = len (grade) 5 se nr == 0: 6 retorno 0 7 nc = len (grade [0]) 8 num_islands = 0 9 para r na faixa (nr): 10 para c na faixa (nc): 11 se a grade [r] [c] == " 1 " : 12 num_islands + = 1 13 grid [r] [c] = " 0 " 14 vizinhos = collections.deque ([(r, c)]) 15 enquanto vizinhos: 16 linhas, col = neighbours.popleft () 17 para x, y em [(linha - 1, col), (linha + 1, col), (linha, col - 1), (linha, col + 1 )]: 18 se 0 <= x <nr e 0 <= y <nc e grade [x ] [y] == " 1 " : 19 vizinhos.append ((x, y)) 20 grade [x] [y] = " 0 " 21 retornar num_islands