defnumIslands(grid):
ifnot grid:
return0
rows, cols = len(grid), len(grid[0])
count = 0defdfs(r, c):
if r < 0or c < 0or r >= rows or c >= cols or grid[r][c] != '1':
return
grid[r][c] = '0'# 标记为已访问
directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]
for dr, dc in directions:
dfs(r + dr, c + dc)
for i inrange(rows):
for j inrange(cols):
if grid[i][j] == '1':
count += 1
dfs(i, j)
return count
defmaxAreaOfIsland(grid):
ifnot grid:
return0
rows, cols = len(grid), len(grid[0])
max_area = 0defdfs(r, c):
if r < 0or c < 0or r >= rows or c >= cols or grid[r][c] != 1:
return0
grid[r][c] = 0# 标记访问
area = 1
directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]
for dr, dc in directions:
area += dfs(r + dr, c + dc)
return area
for i inrange(rows):
for j inrange(cols):
if grid[i][j] == 1:
current_area = dfs(i, j)
max_area = max(max_area, current_area)
return max_area
defupdateBoard(board, click):
r, c = click
if board[r][c] == 'M':
board[r][c] = 'X'return board
rows, cols = len(board), len(board[0])
directions = [(i, j) for i inrange(-1, 2) for j inrange(-1, 2) if i != 0or j != 0]
defdfs(r, c):
mine_count = 0for dr, dc in directions:
nr, nc = r + dr, c + dc
if0 <= nr < rows and0 <= nc < cols and board[nr][nc] == 'M':
mine_count += 1if mine_count > 0:
board[r][c] = str(mine_count)
else:
board[r][c] = 'B'for dr, dc in directions:
nr, nc = r + dr, c + dc
if0 <= nr < rows and0 <= nc < cols and board[nr][nc] == 'E':
dfs(nr, nc)
dfs(r, c)
return board
机器人的运动范围 (LeetCode 剑指 Offer 13)
题目解析
地上有一个 m 行 n 列的方格。机器人从 [0,0] 开始移动,每次向左、右、上、下移动一格。不能进入行坐标和列坐标的数位之和大于 k 的格子。
算法原理
深度优先遍历。定义辅助函数计算数位之和。使用 visited 数组防止重复统计。
代码实现
defmovingCount(m, n, k):
defdigit_sum(num):
s = 0while num > 0:
s += num % 10
num //= 10return s
visited = [[False] * n for _ inrange(m)]
defdfs(r, c):
if r < 0or c < 0or r >= m or c >= n or visited[r][c]:
return0if digit_sum(r) + digit_sum(c) > k:
return0
visited[r][c] = Truereturn1 + dfs(r + 1, c) + dfs(r - 1, c) + dfs(r, c + 1) + dfs(r, c - 1)
return dfs(0, 0)