python-回溯算法

什么是回溯算法?(递归?)
回溯采用试错的方法解决问题。一旦发现当前步骤失败,回溯方法就返回上一个步骤,选择另外一种方式继续试错。
(不碰南墙不回头)
类似于走迷宫一样,我在第一个岔路口的时候选择一条路,然后走着走着,发现没路了。我就又返回我刚刚的那个岔路口,换一条没有走过的路。。
这样一直走下去,总会走出迷宫的。(除非迷宫是个假迷宫)

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(['春','夏','秋','冬'])

python-回溯算法_第1张图片
2、选择问题

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)

python-回溯算法_第2张图片
3、查找单词问题
也可以采用回溯算法

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)

找到返回True,没有就none
python-回溯算法_第3张图片

你可能感兴趣的:(Python,算法)