回溯算法
- 排序方式
- 查找单词
- 八皇后问题
- 解数独
一.排序方式
from IPython.display import Image
Image(filename="./data/6_01.png",width=800,height=960)
原始方法
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)
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)
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)
from IPython.display import Image
Image(filename="./data/6_05.png",width=800,height=960)
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]