classSolution:defupdateMatrix(self, mat: List[List[int]])-> List[List[int]]:
direct =[[0,1],[0,-1],[1,0],[-1,0]]
queue =[]
n =len(mat)
m =len(mat[0])
vis =[[-1for _ inrange(m)]for _ inrange(n)]for i inrange(n):for j inrange(m):if mat[i][j]:continue
vis[i][j]=0
queue.append((i, j,0))while queue:
cur = queue.pop(0)for idx in direct:
x = cur[0]+ idx[0]
y = cur[1]+ idx[1]if x <0or y <0or x >= n or y >= m:continueif vis[x][y]!=-1:continue
vis[x][y]= cur[2]+1
queue.append((x, y, cur[2]+1))return vis
classSolution:defshortestPathBinaryMatrix(self, grid: List[List[int]])->int:if grid[0][0]==1:return-1
direct =[[1,0],[-1,0],[0,1],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]]
n =len(grid)
m =len(grid[0])
vis =[[-1for _ inrange(m)]for _ inrange(n)]# queue = collections.deque()
queue =[(0,0,1)]# 元组
vis[0][0]=1while queue:
cur = queue.pop(0)if cur[0]== n -1and cur[1]== m -1:return cur[2]for idx in direct:
x = cur[0]+ idx[0]
y = cur[1]+ idx[1]if x <0or y <0or x >= n or y >= m or grid[x][y]:continueif vis[x][y]!=-1:continue
vis[x][y]=1
queue.append((x, y, cur[2]+1))return-1
classSolution:defopenLock(self, deadends: List[str], target:str)->int:defget_s(s, ch, k):
tmp =list(s)if k: tmp[ch]=chr(ord(tmp[ch])+1)else: tmp[ch]=chr(ord(tmp[ch])-1)if tmp[ch]>'9': tmp[ch]='0'if tmp[ch]<'0': tmp[ch]='9'return''.join(tmp)
vis =set()for deadend in deadends:
vis.add(deadend)if'0000'in vis:return-1
queue =[('0000',0)]while queue:
cur = queue.pop(0)if target == cur[0]:return cur[1]for ch inrange(4):for k inrange(2):
t = get_s(cur[0], ch, k)if t in vis:continue
vis.add(t)
queue.append((t, cur[1]+1))return-1
面试题13. 机器人的运动范围
classSolution:defmovingCount(self, m:int, n:int, k:int)->int:
vis =set()
direct =[[1,0],[-1,0],[0,1],[0,-1]]
dsum =[0]*100for i inrange(10):for j inrange(10):
dsum[i *10+ j]= i + j
queue =[(0,0)]
vis.add(0)
ans =0while queue:
cur = queue.pop(0)
ans +=1for idx in direct:
x = cur[0]+ idx[0]
y = cur[1]+ idx[1]if x <0or y <0or x >= m or y >= n or(x * n + y)in vis:continueif dsum[x]+ dsum[y]> k:continue
vis.add(x * n + y)
queue.append((x, y))return ans
classSolution:defsolve(self, board: List[List[str]])->None:"""
Do not return anything, modify board in-place instead.
"""defdfs(board, i ,j, m, n):if i <0or j <0or i > m -1or j > n -1:returnif board[i][j]=='X'or board[i][j]=='#':return
board[i][j]='#'
dfs(board, i +1, j, m, n)
dfs(board, i -1, j, m, n)
dfs(board, i, j +1, m, n)
dfs(board, i, j -1, m, n)return
m, n =len(board),len(board[0])
i =0for j inrange(n):if board[i][j]=='X'or board[i][j]=='#':continue
dfs(board, i, j, m, n)
i = m -1for j inrange(n):if board[i][j]=='X'or board[i][j]=='#':continue
dfs(board, i, j, m, n)
j =0for i inrange(m):if board[i][j]=='X'or board[i][j]=='#':continue
dfs(board, i, j, m, n)
j = n -1for i inrange(m):if board[i][j]=='X'or board[i][j]=='#':continue
dfs(board, i, j, m, n)for i inrange(m):for j inrange(n):if board[i][j]=='#': board[i][j]='O'elif board[i][j]=='O': board[i][j]='X'return board
classSolution:defmakesquare(self, matchsticks: List[int])->bool:ifnot matchsticks:returnFalse
total =sum(matchsticks)if total %4!=0:returnFalse
avg = total //4
matchsticks.sort(reverse=True)defdfs(index, w_arr):if index ==len(matchsticks):returnall([i ==0for i in w_arr])for i inrange(len(w_arr)):if i >0and w_arr[i]== w_arr[i-1]:continueif w_arr[i]>= matchsticks[index]:
w_arr[i]-= matchsticks[index]if dfs(index +1, w_arr):returnTrue
w_arr[i]+= matchsticks[index]returnFalsereturn dfs(0,[avg, avg, avg,avg])
classSolution:defsolveNQueens(self, n:int)-> List[List[str]]:
result =[]
queen =[-1]* n
columns =set()
dia1 =set()
dia2 =set()
row =['.']* n
defdfs(row):if row == n:
item = get_item()
result.append(item)else:for i inrange(n):if i in columns or row - i in dia1 or row + i in dia2:continue
queen[row]= i
columns.add(i)
dia1.add(row - i)
dia2.add(row + i)
dfs(row +1)
columns.remove(i)
dia1.remove(row - i)
dia2.remove(row + i)defget_item():
item =[]for i inrange(n):
row[queen[i]]='Q'
item.append("".join(row))
row[queen[i]]='.'return item
dfs(0)return result