classSolution: defpermute(self, nums: List[int]) -> List[List[int]]: ans = [] path = [] not_on_path = {} n = len(nums) defdfs(index:int, not_on_path:set): if index == n: nonlocal ans, path ans.append(path.copy()) return for num in not_on_path: path.append(num) dfs(index+1, not_on_path-{num}) path.pop() dfs(0, set(nums)) return ans
defdfs(row_index:int): if row_index==n: ans.append(["."*col + "Q" + "."*(n-col-1) for col in row]) return for col, ok inenumerate(left_col): if ok and (not row_index+col in row_plus_col) and (not row_index-col+n in row_minus_col): row[row_index] = col row_plus_col.add(row_index+col) row_minus_col.add(row_index-col+n) left_col[col] = False dfs(row_index+1) left_col[col] = True row_plus_col.remove(row_index+col) row_minus_col.remove(row_index-col+n) dfs(0) return ans
defdfs(row_index:int): if row_index==n: nonlocal ans ans += 1 return for col, ok inenumerate(left_col): if ok and (not row_index+col in row_plus_col) and (not row_index-col+n in row_minus_col): row[row_index] = col row_plus_col.add(row_index+col) row_minus_col.add(row_index-col+n) left_col[col] = False dfs(row_index+1) left_col[col] = True row_plus_col.remove(row_index+col) row_minus_col.remove(row_index-col+n) dfs(0) return ans
classSolution: defminimumMoves(self, grid: List[List[int]]) -> int: froms = [] tos = [] for row_index, row inenumerate(grid): for col, num inenumerate(row): if num == 0: tos.append((row_index, col)) elif num > 1: froms.append((row_index, col)) n = len(tos) ans = inf froms_enable = [True]*len(froms) defdfs(to_index:int, cur_sum:int): if to_index == n: nonlocal ans ans = cur_sum # 比小环节提前到进入dfs前剪枝 return
to_x, to_y = tos[to_index] for i, (f_x, f_y) inenumerate(froms): ifnot froms_enable[i]: continue # print(f_x, f_y, to_x, to_y) new_path = cur_sum + abs(f_x-to_x) + abs(f_y-to_y) if new_path < ans: grid[f_x][f_y] -= 1 if grid[f_x][f_y] == 1: froms_enable[i] = False dfs(to_index+1, new_path) if grid[f_x][f_y] == 1: froms_enable[i] = True grid[f_x][f_y] += 1 dfs(0, 0) return ans