Рекурсивное решение для числа островов

1

Я пытаюсь решить проблему Количество островов - LeetCode

Учитывая двумерную сеточную карту '1' (земля) и '0' (вода), подсчитайте количество островов. Остров окружен водой и образован соединением соседних земель по горизонтали или вертикали. Вы можете предположить, что все четыре края сетки окружены водой.

Пример 1:

Input:
11110
11010
11000
00000

Output: 1

Пример 2:

Input:
11000
11000
00100
00011

Output: 3

Принятое решение:

#Recursively solution 
class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        if not grid:
            return 0
        step = 0
        r, c = len(grid), len(grid[0])
        visited = [[False for _ in range(c)] for _ in range(r)]
        for i in range(r):
            for j in range(c):
                if grid[i][j] == "1" and not visited[i][j]:
                    step += 1
                    self.dfs(grid, i, j, visited)
        return step

    def dfs(self, grid, i, j, visited):
        if i<0 or j<0 or i>=len(grid) or j>=len(grid[0]) or grid[i][j] != '1' or visited[i][j]:        
            return 
        visited[i][j] = True
        self.dfs(grid, i+1, j, visited)
        self.dfs(grid, i-1, j, visited)
        self.dfs(grid, i, j+1, visited)
        self.dfs(grid, i, j-1, visited)

В решении использовалась смесь рекурсии и итерации.

Как можно решить проблему исключительно рекурсией?

  • 4
    просто из любопытства прошу. почему он хочет быть рекурсивным, если итеративно работает?
  • 0
    Технически, вместо того, чтобы перебирать карту, вы можете создать DFS поверх нее, но стека вызовов, вероятно, будет слишком много. ИДК, если есть предел этому.
Показать ещё 1 комментарий
Теги:
algorithm

1 ответ

1

Ну, все, что вам нужно сделать, это изменить цикл на рекурсивную функцию, которая переходит от некоторой координаты (r, c) к следующей координате (r, c + 1) или (r + 1,0), когда достигается конец строки.

Образец кода:

def numIslands(grid, row, col):
    if not grid: return 0

    ans = 0

    if grid[row][col]==1:
        ans+=1
        dfs(grid,row,col)

    col+=1
    if col == len(grid[0]):
        col=0
        row+=1

    if row == len(grid):
        return ans

    return ans + numIslands(grid, row, col)

def dfs(grid, i, j):
    if i<0 or j<0 or i>=len(grid) or j>=len(grid[0]) or grid[i][j] != 1:        
        return 
    grid[i][j] = -1
    dfs(grid, i+1, j)
    dfs(grid, i-1, j)
    dfs(grid, i, j+1)
    dfs(grid, i, j-1)


print(numIslands([
[1,1,0,0,0],
[1,1,0,0,0],
[0,0,1,0,0],
[0,0,0,1,1]
],0,0))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню