题目题目https://leetcode.cn/problems/number-of-islands/
这是我dfs入门的题目解析,真的写的超级好!!!题目解析https://leetcode.cn/problems/number-of-islands/solution/dao-yu-lei-wen-ti-de-tong-yong-jie-fa-dfs-bian-li-/
答案
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
def dfs(grid,i,j):
if not 0 <= i < len(grid) or not 0 <= j < len(grid[0]) or grid[i][j] == '0':
return
grid[i][j] = '0'
dfs(grid,i+1,j)
dfs(grid,i,j+1)
dfs(grid,i-1,j)
dfs(grid,i,j-1)
cnt = 0
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == '1':
dfs(grid,i,j)
cnt += 1
return cnt
或者
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
dir = [[0,1],[0,-1],[1,0],[-1,0]]
cnt = 0
def dfs(grid,i,j):
if not 0 <= i < len(grid) or not 0 <= j < len(grid[0]) or grid[i][j] == '0':
return
grid[i][j] = '0'
newi = i
newj = j
for k in range(4):
newi = i + dir[k][0]
newj = j + dir[k][1]
dfs(grid,newi,newj)
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == '1':
dfs(grid,i,j)
cnt+=1
return cnt
感悟:
cnt += 1出现在dfs(grid,i,j)的下面,说明:将一个岛屿的各个板块都遍历了一遍(将1变成0)才会进行cnt+=1操作。
更新题解:
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
cnt = 0
def dfs(x,y):
vis = [[1,0],[-1,0],[0,1],[0,-1]]
for i,j in vis:
xx = x + i
yy = y + j
if 0 <= xx < len(grid) and 0 <= yy < len(grid[0]) and grid[xx][yy] == '1':
grid[xx][yy] = '0'
dfs(xx,yy)
for x in range(len(grid)):
for y in range(len(grid[0])):
if grid[x][y] == '1':
grid[x][y] = '0'
cnt += 1
dfs(x,y)
return cnt