回溯算法

回溯算法

  • 排序方式
  • 查找单词
  • 八皇后问题
  • 解数独

一.排序方式

from IPython.display import Image
Image(filename="./data/6_01.png",width=800,height=960)

output_3_0.png

原始方法

def solvePermutationBadWay(array):
    solution=[]
    
    for i in range(len(array)):
        newSolution1=solution+[array[i]]
        newArray1=array[:i]+array[i+1:]
        
        for i in range(len(newArray1)):
            newSolution2=newSolution1+[newArray1[i]]
            newArray2=newArray1[:i]+newArray1[i+1:]
            
            for i in range(len(newArray2)):
                newSolution3=newSolution2+[newArray2[i]]
                newArray3=newArray2[:i]+newArray2[i+1:]
                
                for i in range(len(newArray3)):
                    newSolution4=newSolution3+[newArray3[i]]
                    print(newSolution4)
array=["红","黄","蓝","绿"]
solvePermutationBadWay(array)
['红', '黄', '蓝', '绿']
['红', '黄', '绿', '蓝']
['红', '蓝', '黄', '绿']
['红', '蓝', '绿', '黄']
['红', '绿', '黄', '蓝']
['红', '绿', '蓝', '黄']
['黄', '红', '蓝', '绿']
['黄', '红', '绿', '蓝']
['黄', '蓝', '红', '绿']
['黄', '蓝', '绿', '红']
['黄', '绿', '红', '蓝']
['黄', '绿', '蓝', '红']
['蓝', '红', '黄', '绿']
['蓝', '红', '绿', '黄']
['蓝', '黄', '红', '绿']
['蓝', '黄', '绿', '红']
['蓝', '绿', '红', '黄']
['蓝', '绿', '黄', '红']
['绿', '红', '黄', '蓝']
['绿', '红', '蓝', '黄']
['绿', '黄', '红', '蓝']
['绿', '黄', '蓝', '红']
['绿', '蓝', '红', '黄']
['绿', '蓝', '黄', '红']

回溯方法

def helper(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:]
        helper(newArray,newSolution)
array=["红","黄","蓝","绿"]
helper(array,solution=[])
['红', '黄', '蓝', '绿']
['红', '黄', '绿', '蓝']
['红', '蓝', '黄', '绿']
['红', '蓝', '绿', '黄']
['红', '绿', '黄', '蓝']
['红', '绿', '蓝', '黄']
['黄', '红', '蓝', '绿']
['黄', '红', '绿', '蓝']
['黄', '蓝', '红', '绿']
['黄', '蓝', '绿', '红']
['黄', '绿', '红', '蓝']
['黄', '绿', '蓝', '红']
['蓝', '红', '黄', '绿']
['蓝', '红', '绿', '黄']
['蓝', '黄', '红', '绿']
['蓝', '黄', '绿', '红']
['蓝', '绿', '红', '黄']
['蓝', '绿', '黄', '红']
['绿', '红', '黄', '蓝']
['绿', '红', '蓝', '黄']
['绿', '黄', '红', '蓝']
['绿', '黄', '蓝', '红']
['绿', '蓝', '红', '黄']
['绿', '蓝', '黄', '红']

完整代码

class Solution():
    def __init__(self):
        pass
    
    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:]
            helper(newArray,newSolution)
solution=Solution()

solution.solvePermutation(array)
['红', '黄', '蓝', '绿']
['红', '黄', '绿', '蓝']
['红', '蓝', '黄', '绿']
['红', '蓝', '绿', '黄']
['红', '绿', '黄', '蓝']
['红', '绿', '蓝', '黄']
['黄', '红', '蓝', '绿']
['黄', '红', '绿', '蓝']
['黄', '蓝', '红', '绿']
['黄', '蓝', '绿', '红']
['黄', '绿', '红', '蓝']
['黄', '绿', '蓝', '红']
['蓝', '红', '黄', '绿']
['蓝', '红', '绿', '黄']
['蓝', '黄', '红', '绿']
['蓝', '黄', '绿', '红']
['蓝', '绿', '红', '黄']
['蓝', '绿', '黄', '红']
['绿', '红', '黄', '蓝']
['绿', '红', '蓝', '黄']
['绿', '黄', '红', '蓝']
['绿', '黄', '蓝', '红']
['绿', '蓝', '红', '黄']
['绿', '蓝', '黄', '红']
class Solution(object):
    def __init__(self):
        pass
    
    def solveCombinationBadWay(self,array,n):
        solution=[]
        
        for i in range(len(array)):
            newSolutional=solution+[array[i]]
            newArray=array[i+1:]
            
            for i in range(len(newArray)):
                newSolutiona2=newSolutional+[newArray[i]]
                
                print(newSolutiona2)
solution=Solution()

solution.solveCombinationBadWay(array,2)
['红', '黄']
['红', '蓝']
['红', '绿']
['黄', '蓝']
['黄', '绿']
['蓝', '绿']
def helper(array,n,solution):
    if len(solution)==n:
        print(solution)
        return
    
    for i in range(len(array)):
        newSolution=solution+[array[i]]
        newArray=array[i+1:]
        helper(newArray,n,newSolution)
array=["A","B","C","D"]

helper(array,2,[])
['A', 'B']
['A', 'C']
['A', 'D']
['B', 'C']
['B', 'D']
['C', 'D']
class Solution():
    def __init__(self):
        pass
    
    def solveCombination(self,array,n):
        self.helper(array,n,[])
        
    def helper(self,array,n,solution):
        if len(solution)==2:
            print(solution)
            return
        
        for i in range(len(array)):
            newSolution=solution+[array[i]]
            newArray=array[i+1:]
            self.helper(newArray,n,newSolution)
solution=Solution()

solution.solveCombination(array,2)
['A', 'B']
['A', 'C']
['A', 'D']
['B', 'C']
['B', 'D']
['C', 'D']

二.单词查找

Image(filename="./data/6_02.png",width=800,height=960)

output_20_0.png

def helper(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 helper(board,current[1:],row-1,column):
                return True
            
            if helper(board,current[1:],row+1,column):
                return True
            
            if helper(board,current[1:],row,column-1):
                return True
            
            if helper(board,current[1:],row,column+1):
                return True
            
            board[row][column]=current[0]
            
    return False
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"]
]

row=5
column=5

current="week"

helper(board,current,row,column)
False

回溯方法

class Solution(object):
    def __init__(self):
        pass
    
    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
                
        return False
    
    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]
            
        return False
Solution().wordSearch(board,"week")
True

三.八皇后问题

Image(filename="./data/6_03.png",width=800,height=960)

output_27_0.png

class Solution(object):
    def __init__(self):
        pass
    
    def solveNQueens(self,n):
        self.helper([-1]*n,0,n)
        
    def helper(self,columnPositions,rowIndex,n):
        if rowIndex==n:
            self.printSolution(columnPositions,n)
            return
        
        for column in range(n):
            columnPositions[rowIndex]=column
            
            if self.isValid(columnPositions,rowIndex):
                self.helper(columnPositions,rowIndex+1,n)
                
                
    def isValid(self,columnPositions,rowIndex):
        for i in range(rowIndex):
            # 检查同列是否有皇后
            if columnPositions[i]==columnPositions[rowIndex]:
                return False
            
            # 检查两条斜线上是否有皇后
            elif abs(columnPositions[i]-columnPositions[rowIndex])==rowIndex-i:
                return False
            
        return True
    
    def printSolution(self,columnPositions,n):
        for row in range(n):
            line=""
            
            for column in range(n):
                if columnPositions[row]==column:
                    line+="Q "
                    
                else:
                    line+=". "
            print(line)
            
        print("\n")
Solution().solveNQueens(8)
Q . . . . . . . 
. . . . Q . . . 
. . . . . . . Q 
. . . . . Q . . 
. . Q . . . . . 
. . . . . . Q . 
. Q . . . . . . 
. . . Q . . . . 


Q . . . . . . . 
. . . . . Q . . 
. . . . . . . Q 
. . Q . . . . . 
. . . . . . Q . 
. . . Q . . . . 
. Q . . . . . . 
. . . . Q . . . 


Q . . . . . . . 
. . . . . . Q . 
. . . Q . . . . 
. . . . . Q . . 
. . . . . . . Q 
. Q . . . . . . 
. . . . Q . . . 
. . Q . . . . . 


Q . . . . . . . 
. . . . . . Q . 
. . . . Q . . . 
. . . . . . . Q 
. Q . . . . . . 
. . . Q . . . . 
. . . . . Q . . 
. . Q . . . . . 


. Q . . . . . . 
. . . Q . . . . 
. . . . . Q . . 
. . . . . . . Q 
. . Q . . . . . 
Q . . . . . . . 
. . . . . . Q . 
. . . . Q . . . 


. Q . . . . . . 
. . . . Q . . . 
. . . . . . Q . 
Q . . . . . . . 
. . Q . . . . . 
. . . . . . . Q 
. . . . . Q . . 
. . . Q . . . . 


. Q . . . . . . 
. . . . Q . . . 
. . . . . . Q . 
. . . Q . . . . 
Q . . . . . . . 
. . . . . . . Q 
. . . . . Q . . 
. . Q . . . . . 


. Q . . . . . . 
. . . . . Q . . 
Q . . . . . . . 
. . . . . . Q . 
. . . Q . . . . 
. . . . . . . Q 
. . Q . . . . . 
. . . . Q . . . 


. Q . . . . . . 
. . . . . Q . . 
. . . . . . . Q 
. . Q . . . . . 
Q . . . . . . . 
. . . Q . . . . 
. . . . . . Q . 
. . . . Q . . . 


. Q . . . . . . 
. . . . . . Q . 
. . Q . . . . . 
. . . . . Q . . 
. . . . . . . Q 
. . . . Q . . . 
Q . . . . . . . 
. . . Q . . . . 


. Q . . . . . . 
. . . . . . Q . 
. . . . Q . . . 
. . . . . . . Q 
Q . . . . . . . 
. . . Q . . . . 
. . . . . Q . . 
. . Q . . . . . 


. Q . . . . . . 
. . . . . . . Q 
. . . . . Q . . 
Q . . . . . . . 
. . Q . . . . . 
. . . . Q . . . 
. . . . . . Q . 
. . . Q . . . . 


. . Q . . . . . 
Q . . . . . . . 
. . . . . . Q . 
. . . . Q . . . 
. . . . . . . Q 
. Q . . . . . . 
. . . Q . . . . 
. . . . . Q . . 


. . Q . . . . . 
. . . . Q . . . 
. Q . . . . . . 
. . . . . . . Q 
Q . . . . . . . 
. . . . . . Q . 
. . . Q . . . . 
. . . . . Q . . 


. . Q . . . . . 
. . . . Q . . . 
. Q . . . . . . 
. . . . . . . Q 
. . . . . Q . . 
. . . Q . . . . 
. . . . . . Q . 
Q . . . . . . . 


. . Q . . . . . 
. . . . Q . . . 
. . . . . . Q . 
Q . . . . . . . 
. . . Q . . . . 
. Q . . . . . . 
. . . . . . . Q 
. . . . . Q . . 


. . Q . . . . . 
. . . . Q . . . 
. . . . . . . Q 
. . . Q . . . . 
Q . . . . . . . 
. . . . . . Q . 
. Q . . . . . . 
. . . . . Q . . 


. . Q . . . . . 
. . . . . Q . . 
. Q . . . . . . 
. . . . Q . . . 
. . . . . . . Q 
Q . . . . . . . 
. . . . . . Q . 
. . . Q . . . . 


. . Q . . . . . 
. . . . . Q . . 
. Q . . . . . . 
. . . . . . Q . 
Q . . . . . . . 
. . . Q . . . . 
. . . . . . . Q 
. . . . Q . . . 


. . Q . . . . . 
. . . . . Q . . 
. Q . . . . . . 
. . . . . . Q . 
. . . . Q . . . 
Q . . . . . . . 
. . . . . . . Q 
. . . Q . . . . 


. . Q . . . . . 
. . . . . Q . . 
. . . Q . . . . 
Q . . . . . . . 
. . . . . . . Q 
. . . . Q . . . 
. . . . . . Q . 
. Q . . . . . . 


. . Q . . . . . 
. . . . . Q . . 
. . . Q . . . . 
. Q . . . . . . 
. . . . . . . Q 
. . . . Q . . . 
. . . . . . Q . 
Q . . . . . . . 


. . Q . . . . . 
. . . . . Q . . 
. . . . . . . Q 
Q . . . . . . . 
. . . Q . . . . 
. . . . . . Q . 
. . . . Q . . . 
. Q . . . . . . 


. . Q . . . . . 
. . . . . Q . . 
. . . . . . . Q 
Q . . . . . . . 
. . . . Q . . . 
. . . . . . Q . 
. Q . . . . . . 
. . . Q . . . . 


. . Q . . . . . 
. . . . . Q . . 
. . . . . . . Q 
. Q . . . . . . 
. . . Q . . . . 
Q . . . . . . . 
. . . . . . Q . 
. . . . Q . . . 


. . Q . . . . . 
. . . . . . Q . 
. Q . . . . . . 
. . . . . . . Q 
. . . . Q . . . 
Q . . . . . . . 
. . . Q . . . . 
. . . . . Q . . 


. . Q . . . . . 
. . . . . . Q . 
. Q . . . . . . 
. . . . . . . Q 
. . . . . Q . . 
. . . Q . . . . 
Q . . . . . . . 
. . . . Q . . . 


. . Q . . . . . 
. . . . . . . Q 
. . . Q . . . . 
. . . . . . Q . 
Q . . . . . . . 
. . . . . Q . . 
. Q . . . . . . 
. . . . Q . . . 


. . . Q . . . . 
Q . . . . . . . 
. . . . Q . . . 
. . . . . . . Q 
. Q . . . . . . 
. . . . . . Q . 
. . Q . . . . . 
. . . . . Q . . 


. . . Q . . . . 
Q . . . . . . . 
. . . . Q . . . 
. . . . . . . Q 
. . . . . Q . . 
. . Q . . . . . 
. . . . . . Q . 
. Q . . . . . . 


. . . Q . . . . 
. Q . . . . . . 
. . . . Q . . . 
. . . . . . . Q 
. . . . . Q . . 
Q . . . . . . . 
. . Q . . . . . 
. . . . . . Q . 


. . . Q . . . . 
. Q . . . . . . 
. . . . . . Q . 
. . Q . . . . . 
. . . . . Q . . 
. . . . . . . Q 
Q . . . . . . . 
. . . . Q . . . 


. . . Q . . . . 
. Q . . . . . . 
. . . . . . Q . 
. . Q . . . . . 
. . . . . Q . . 
. . . . . . . Q 
. . . . Q . . . 
Q . . . . . . . 


. . . Q . . . . 
. Q . . . . . . 
. . . . . . Q . 
. . . . Q . . . 
Q . . . . . . . 
. . . . . . . Q 
. . . . . Q . . 
. . Q . . . . . 


. . . Q . . . . 
. Q . . . . . . 
. . . . . . . Q 
. . . . Q . . . 
. . . . . . Q . 
Q . . . . . . . 
. . Q . . . . . 
. . . . . Q . . 


. . . Q . . . . 
. Q . . . . . . 
. . . . . . . Q 
. . . . . Q . . 
Q . . . . . . . 
. . Q . . . . . 
. . . . Q . . . 
. . . . . . Q . 


. . . Q . . . . 
. . . . . Q . . 
Q . . . . . . . 
. . . . Q . . . 
. Q . . . . . . 
. . . . . . . Q 
. . Q . . . . . 
. . . . . . Q . 


. . . Q . . . . 
. . . . . Q . . 
. . . . . . . Q 
. Q . . . . . . 
. . . . . . Q . 
Q . . . . . . . 
. . Q . . . . . 
. . . . Q . . . 


. . . Q . . . . 
. . . . . Q . . 
. . . . . . . Q 
. . Q . . . . . 
Q . . . . . . . 
. . . . . . Q . 
. . . . Q . . . 
. Q . . . . . . 


. . . Q . . . . 
. . . . . . Q . 
Q . . . . . . . 
. . . . . . . Q 
. . . . Q . . . 
. Q . . . . . . 
. . . . . Q . . 
. . Q . . . . . 


. . . Q . . . . 
. . . . . . Q . 
. . Q . . . . . 
. . . . . . . Q 
. Q . . . . . . 
. . . . Q . . . 
Q . . . . . . . 
. . . . . Q . . 


. . . Q . . . . 
. . . . . . Q . 
. . . . Q . . . 
. Q . . . . . . 
. . . . . Q . . 
Q . . . . . . . 
. . Q . . . . . 
. . . . . . . Q 


. . . Q . . . . 
. . . . . . Q . 
. . . . Q . . . 
. . Q . . . . . 
Q . . . . . . . 
. . . . . Q . . 
. . . . . . . Q 
. Q . . . . . . 


. . . Q . . . . 
. . . . . . . Q 
Q . . . . . . . 
. . Q . . . . . 
. . . . . Q . . 
. Q . . . . . . 
. . . . . . Q . 
. . . . Q . . . 


. . . Q . . . . 
. . . . . . . Q 
Q . . . . . . . 
. . . . Q . . . 
. . . . . . Q . 
. Q . . . . . . 
. . . . . Q . . 
. . Q . . . . . 


. . . Q . . . . 
. . . . . . . Q 
. . . . Q . . . 
. . Q . . . . . 
Q . . . . . . . 
. . . . . . Q . 
. Q . . . . . . 
. . . . . Q . . 


. . . . Q . . . 
Q . . . . . . . 
. . . Q . . . . 
. . . . . Q . . 
. . . . . . . Q 
. Q . . . . . . 
. . . . . . Q . 
. . Q . . . . . 


. . . . Q . . . 
Q . . . . . . . 
. . . . . . . Q 
. . . Q . . . . 
. Q . . . . . . 
. . . . . . Q . 
. . Q . . . . . 
. . . . . Q . . 


. . . . Q . . . 
Q . . . . . . . 
. . . . . . . Q 
. . . . . Q . . 
. . Q . . . . . 
. . . . . . Q . 
. Q . . . . . . 
. . . Q . . . . 


. . . . Q . . . 
. Q . . . . . . 
. . . Q . . . . 
. . . . . Q . . 
. . . . . . . Q 
. . Q . . . . . 
Q . . . . . . . 
. . . . . . Q . 


. . . . Q . . . 
. Q . . . . . . 
. . . Q . . . . 
. . . . . . Q . 
. . Q . . . . . 
. . . . . . . Q 
. . . . . Q . . 
Q . . . . . . . 


. . . . Q . . . 
. Q . . . . . . 
. . . . . Q . . 
Q . . . . . . . 
. . . . . . Q . 
. . . Q . . . . 
. . . . . . . Q 
. . Q . . . . . 


. . . . Q . . . 
. Q . . . . . . 
. . . . . . . Q 
Q . . . . . . . 
. . . Q . . . . 
. . . . . . Q . 
. . Q . . . . . 
. . . . . Q . . 


. . . . Q . . . 
. . Q . . . . . 
Q . . . . . . . 
. . . . . Q . . 
. . . . . . . Q 
. Q . . . . . . 
. . . Q . . . . 
. . . . . . Q . 


. . . . Q . . . 
. . Q . . . . . 
Q . . . . . . . 
. . . . . . Q . 
. Q . . . . . . 
. . . . . . . Q 
. . . . . Q . . 
. . . Q . . . . 


. . . . Q . . . 
. . Q . . . . . 
. . . . . . . Q 
. . . Q . . . . 
. . . . . . Q . 
Q . . . . . . . 
. . . . . Q . . 
. Q . . . . . . 


. . . . Q . . . 
. . . . . . Q . 
Q . . . . . . . 
. . Q . . . . . 
. . . . . . . Q 
. . . . . Q . . 
. . . Q . . . . 
. Q . . . . . . 


. . . . Q . . . 
. . . . . . Q . 
Q . . . . . . . 
. . . Q . . . . 
. Q . . . . . . 
. . . . . . . Q 
. . . . . Q . . 
. . Q . . . . . 


. . . . Q . . . 
. . . . . . Q . 
. Q . . . . . . 
. . . Q . . . . 
. . . . . . . Q 
Q . . . . . . . 
. . Q . . . . . 
. . . . . Q . . 


. . . . Q . . . 
. . . . . . Q . 
. Q . . . . . . 
. . . . . Q . . 
. . Q . . . . . 
Q . . . . . . . 
. . . Q . . . . 
. . . . . . . Q 


. . . . Q . . . 
. . . . . . Q . 
. Q . . . . . . 
. . . . . Q . . 
. . Q . . . . . 
Q . . . . . . . 
. . . . . . . Q 
. . . Q . . . . 


. . . . Q . . . 
. . . . . . Q . 
. . . Q . . . . 
Q . . . . . . . 
. . Q . . . . . 
. . . . . . . Q 
. . . . . Q . . 
. Q . . . . . . 


. . . . Q . . . 
. . . . . . . Q 
. . . Q . . . . 
Q . . . . . . . 
. . Q . . . . . 
. . . . . Q . . 
. Q . . . . . . 
. . . . . . Q . 


. . . . Q . . . 
. . . . . . . Q 
. . . Q . . . . 
Q . . . . . . . 
. . . . . . Q . 
. Q . . . . . . 
. . . . . Q . . 
. . Q . . . . . 


. . . . . Q . . 
Q . . . . . . . 
. . . . Q . . . 
. Q . . . . . . 
. . . . . . . Q 
. . Q . . . . . 
. . . . . . Q . 
. . . Q . . . . 


. . . . . Q . . 
. Q . . . . . . 
. . . . . . Q . 
Q . . . . . . . 
. . Q . . . . . 
. . . . Q . . . 
. . . . . . . Q 
. . . Q . . . . 


. . . . . Q . . 
. Q . . . . . . 
. . . . . . Q . 
Q . . . . . . . 
. . . Q . . . . 
. . . . . . . Q 
. . . . Q . . . 
. . Q . . . . . 


. . . . . Q . . 
. . Q . . . . . 
Q . . . . . . . 
. . . . . . Q . 
. . . . Q . . . 
. . . . . . . Q 
. Q . . . . . . 
. . . Q . . . . 


. . . . . Q . . 
. . Q . . . . . 
Q . . . . . . . 
. . . . . . . Q 
. . . Q . . . . 
. Q . . . . . . 
. . . . . . Q . 
. . . . Q . . . 


. . . . . Q . . 
. . Q . . . . . 
Q . . . . . . . 
. . . . . . . Q 
. . . . Q . . . 
. Q . . . . . . 
. . . Q . . . . 
. . . . . . Q . 


. . . . . Q . . 
. . Q . . . . . 
. . . . Q . . . 
. . . . . . Q . 
Q . . . . . . . 
. . . Q . . . . 
. Q . . . . . . 
. . . . . . . Q 


. . . . . Q . . 
. . Q . . . . . 
. . . . Q . . . 
. . . . . . . Q 
Q . . . . . . . 
. . . Q . . . . 
. Q . . . . . . 
. . . . . . Q . 


. . . . . Q . . 
. . Q . . . . . 
. . . . . . Q . 
. Q . . . . . . 
. . . Q . . . . 
. . . . . . . Q 
Q . . . . . . . 
. . . . Q . . . 


. . . . . Q . . 
. . Q . . . . . 
. . . . . . Q . 
. Q . . . . . . 
. . . . . . . Q 
. . . . Q . . . 
Q . . . . . . . 
. . . Q . . . . 


. . . . . Q . . 
. . Q . . . . . 
. . . . . . Q . 
. . . Q . . . . 
Q . . . . . . . 
. . . . . . . Q 
. Q . . . . . . 
. . . . Q . . . 


. . . . . Q . . 
. . . Q . . . . 
Q . . . . . . . 
. . . . Q . . . 
. . . . . . . Q 
. Q . . . . . . 
. . . . . . Q . 
. . Q . . . . . 


. . . . . Q . . 
. . . Q . . . . 
. Q . . . . . . 
. . . . . . . Q 
. . . . Q . . . 
. . . . . . Q . 
Q . . . . . . . 
. . Q . . . . . 


. . . . . Q . . 
. . . Q . . . . 
. . . . . . Q . 
Q . . . . . . . 
. . Q . . . . . 
. . . . Q . . . 
. Q . . . . . . 
. . . . . . . Q 


. . . . . Q . . 
. . . Q . . . . 
. . . . . . Q . 
Q . . . . . . . 
. . . . . . . Q 
. Q . . . . . . 
. . . . Q . . . 
. . Q . . . . . 


. . . . . Q . . 
. . . . . . . Q 
. Q . . . . . . 
. . . Q . . . . 
Q . . . . . . . 
. . . . . . Q . 
. . . . Q . . . 
. . Q . . . . . 


. . . . . . Q . 
Q . . . . . . . 
. . Q . . . . . 
. . . . . . . Q 
. . . . . Q . . 
. . . Q . . . . 
. Q . . . . . . 
. . . . Q . . . 


. . . . . . Q . 
. Q . . . . . . 
. . . Q . . . . 
Q . . . . . . . 
. . . . . . . Q 
. . . . Q . . . 
. . Q . . . . . 
. . . . . Q . . 


. . . . . . Q . 
. Q . . . . . . 
. . . . . Q . . 
. . Q . . . . . 
Q . . . . . . . 
. . . Q . . . . 
. . . . . . . Q 
. . . . Q . . . 


. . . . . . Q . 
. . Q . . . . . 
Q . . . . . . . 
. . . . . Q . . 
. . . . . . . Q 
. . . . Q . . . 
. Q . . . . . . 
. . . Q . . . . 


. . . . . . Q . 
. . Q . . . . . 
. . . . . . . Q 
. Q . . . . . . 
. . . . Q . . . 
Q . . . . . . . 
. . . . . Q . . 
. . . Q . . . . 


. . . . . . Q . 
. . . Q . . . . 
. Q . . . . . . 
. . . . Q . . . 
. . . . . . . Q 
Q . . . . . . . 
. . Q . . . . . 
. . . . . Q . . 


. . . . . . Q . 
. . . Q . . . . 
. Q . . . . . . 
. . . . . . . Q 
. . . . . Q . . 
Q . . . . . . . 
. . Q . . . . . 
. . . . Q . . . 


. . . . . . Q . 
. . . . Q . . . 
. . Q . . . . . 
Q . . . . . . . 
. . . . . Q . . 
. . . . . . . Q 
. Q . . . . . . 
. . . Q . . . . 


. . . . . . . Q 
. Q . . . . . . 
. . . Q . . . . 
Q . . . . . . . 
. . . . . . Q . 
. . . . Q . . . 
. . Q . . . . . 
. . . . . Q . . 


. . . . . . . Q 
. Q . . . . . . 
. . . . Q . . . 
. . Q . . . . . 
Q . . . . . . . 
. . . . . . Q . 
. . . Q . . . . 
. . . . . Q . . 


. . . . . . . Q 
. . Q . . . . . 
Q . . . . . . . 
. . . . . Q . . 
. Q . . . . . . 
. . . . Q . . . 
. . . . . . Q . 
. . . Q . . . . 


. . . . . . . Q 
. . . Q . . . . 
Q . . . . . . . 
. . Q . . . . . 
. . . . . Q . . 
. Q . . . . . . 
. . . . . . Q . 
. . . . Q . . .

四.解数独

Image(filename="./data/6_04.png",width=800,height=960)

output_31_0.png

from IPython.display import Image

Image(filename="./data/6_05.png",width=800,height=960)

output_32_0.png

class Solution(object):
    def __init__(self):
        pass
    
    def solveSudoku(self,board):
        self.helper(board,0)
        
    def helper(self,board,index):
        if index>=81:
            # 盘面已满,输出结果
            self.printSolution(board)
            return
        
        if board[index]==0:
            for i in range(1,10):
                if self.isValid(board,index,i):
                    board[index]=i
                    self.helper(board,index+1)
                    board[index]=0
                    
        else:
            self.helper(board,index+1)
            
        
    def printSolution(self,board):
        for i in range(0,81,9):
            print(board[i:i+9])
            
    def isValid(self,board,index,num):
        # 当前格子的行数
        row=index//9
        # 当前格子的列数
        column=index%9
        
        # 检查和同列(下方)的格子是否矛盾
        for i in range(index+9,81,9):
            if board[i]==num:
                return False
        # 检查和同列(上方)的格子是否矛盾    
        for i in range(index-9,-1,-9):
            if board[i]==num:
                return False
         # 检查和同行的格子是否矛盾   
        for i in range(9*row,9*(row+1)):
            if board[i]==num:
                return False
         # 检查和同粗线的格子是否矛盾   
        for i in range(row-row%3,3+row-row%3):
            for j in range(column-column%3,3+column-column%3):
                if board[j+i*9]==num:
                    return False
                
        return True
board=[
    4,1,0,0,0,7,8,5,0,
    8,0,6,0,0,0,0,0,9,
    0,2,0,0,9,0,6,0,0,
    0,0,4,0,0,0,0,1,2,
    2,0,0,5,8,0,0,7,0,
    0,0,0,0,0,0,5,0,0,
    0,0,0,7,0,2,0,0,0,
    0,0,8,0,1,0,0,0,0,
    0,7,0,0,6,0,0,0,0,
]

Solution().solveSudoku(board)
[4, 1, 9, 6, 2, 7, 8, 5, 3]
[8, 3, 6, 1, 5, 4, 7, 2, 9]
[7, 2, 5, 3, 9, 8, 6, 4, 1]
[5, 8, 4, 9, 7, 6, 3, 1, 2]
[2, 9, 3, 5, 8, 1, 4, 7, 6]
[1, 6, 7, 2, 4, 3, 5, 9, 8]
[6, 4, 1, 7, 3, 2, 9, 8, 5]
[3, 5, 8, 4, 1, 9, 2, 6, 7]
[9, 7, 2, 8, 6, 5, 1, 3, 4]
posted @ 2019-11-09 18:23  LQ6H  阅读(178)  评论(0编辑  收藏  举报