python回溯方法_回溯法--python

class Solution:

def solveSudoku(self, board) -> None:

# 对 board[i][j] 进行穷举尝试

def backtrack(board, i, j):

m, n = 9, 9

if j == n: # 走到9才越界,进入下一行

return backtrack(board, i+1, 0)

if i == m: # 走到最后一行,找到一个可行解

return True

if board[i][j] != '.': # 当前是预设数字,直接跳到下一个

return backtrack(board, i, j+1)

ch_list = ['1','2','3','4','5','6','7','8','9']

for ch in ch_list:

if not isValid(board, i, j, ch): # 如果遇到不合法的数字,则跳过

continue

board[i][j] = ch # 做选择

if backtrack(board, i, j+1): # 如果找到一个可行解,立即结束

return True

board[i][j] = '.' # 撤销选择

# 穷举完 1~9,依然没有找到可行解,此路不通

return False

# 判断 board[i][j] 是否可以填入 n

def isValid(board, r, c, n):

for i in range(9):

# 判断行是否存在重复

if board[r][i] == n: return False

# 判断列是否存在重复

if board[i][c] == n: return False

# 判断 3 * 3 方框是否存在重复

if board[(r//3)*3 + i//3][(c//3)*3 + i%3] == n:

return False

return True

backtrack(board, 0, 0)

力扣解数独 37题力扣​leetcode-cn.com

剑指offer 38全排列力扣​leetcode-cn.com

class Solution:

def permutation(self, s: str) -> List[str]:

if not s: return

s=list(sorted(s))

res=[]

def helper(s,tmp):

if not s: res.append(''.join(tmp))

for i,char in enumerate(s):

if i>0 and s[i]==s[i-1]:

continue

helper(s[:i]+s[i+1:],tmp+[char])

helper(s,[])

return list(set(res))

#模板

class Solution:

def permuteUnique(self, nums: List[int]) -> List[List[int]]:

res=[]

nums.sort()

def helper(nums,temp):

if not nums:

res.append(temp)

for i in range(len(nums)):

if i>0 and nums[i]==nums[i-1]:

continue

helper(nums[:i]+nums[i+1:],temp+[nums[i]])

helper(nums,[])

return res

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值