什么是回溯算法?(递归?)
回溯采用试错的方法解决问题。一旦发现当前步骤失败,回溯方法就返回上一个步骤,选择另外一种方式继续试错。
(不碰南墙不回头)
类似于走迷宫一样,我在第一个岔路口的时候选择一条路,然后走着走着,发现没路了。我就又返回我刚刚的那个岔路口,换一条没有走过的路。。
这样一直走下去,总会走出迷宫的。(除非迷宫是个假迷宫)
1、遍历所有的排序方式(遍历所有的可能结果)
举一个春夏秋冬的排序例子,共有4!种排序方式
class solution(object):
def solvePermutation(self,array):
self.helper(array,[])
def helper(self,array,solution):
if len(array) == 0: #如果遍历完了的话
print(solution) #就打印出来
return #返回上一级
for i in range(len(array)): #遍历
newSolution = solution+[array[i]]
newArray = array[:i] + array[i+1:]
self.helper(newArray,newSolution)
s = solution()
s.solvePermutation(['春','夏','秋','冬'])
class solution(object):
def solutionPre(self,array,n):
self.solutionfunction(array,n,[])
def solutionfunction(self,array,n,solution):
if len(solution) == n:
print(solution)
return
for i in range(len(array)):
newsolution = solution + [array[i]]
newArray = array[i+1:]
self.solutionfunction(newArray,n,newsolution)#回溯
s = solution()
s.solutionPre(['A','B','C','D'],2)
class solution(object):
def wordSearch(self,board,word):
for i in range(len(board)): #行树
for j in range(len(board[0])): #列
if self.helper(board,word,i,j): #查找
return True
def helper(self,board,current,row,column):
if len(current) == 0:
return True
if row>=0 and row<len(board) and column >=0 and column<len(board[0]):
if board[row][column] == current[0]:
board[row][column] = "" #四个方向开始寻找
if self.helper(board,current[1:],row-1,column):
return True
if self.helper(board,current[1:],row+1,column):
return True
if self.helper(board,current[1:],row,column-1):
return True
if self.helper(board,current[1:],row,column+1):
return True
board[row][column]= current[0]
board = [['a','c','r','y','l'],
['l','w','o','r','i'],
['a','f','d','l','c'],
['k','e','e','w','e'],
['o','d','r','o','s']]
s = solution()
a = s.wordSearch(board,'week')
b = s.wordSearch(board,'mao')
print(a)
print(b)