什么是回溯:

简单来说,就是尝试的方式解决问题,如果一旦发现失败,则返回上一步骤,更改新的参数,继续尝试,如果成功,则获得答案

场景描述:

保安部负责人小安面临一个问题,他需要在8X8公里安放8个保安站点
要求:每一行,每一列,每一个斜线,都只有一个站点,求设计方案

比如下面这个:

 

    分析过程:

  1.保安放置在第一行某个位置,如果不冲突则进行第二行某个位置的放置

  2.第二行不冲突,则进行第三行某个位置的放置

       3.如果发生冲突,更改该行的column,依次递增,继续判断

 

 

代码如下:
 1 '''
 2 columnPosition:存放保安位置的数组,比如:[7, 3, 0, 2, 5, 1, 6, 4],下标代表行,下标所在的元素代表列,7代表在第0行,7列
 3 rowindex:行数
 4 '''
 5 
 6 
 7 class solution(object):
 8 
 9     def solveNQueens(self, n):
10         self.helper([-1] * n, 0, n)
11 
12     def helper(self, columnPosition, rowindex, n):  # ding
13 
14         if rowindex == n:
15             print(columnPosition)
16             self.printSolution(columnPosition, n)
17             return
18         # 递归,需要在上一行满足的条件下进行
19         for column in range(n):
20             columnPosition[rowindex] = column
21             if self.isValid(columnPosition, rowindex):
22                 self.helper(columnPosition, rowindex + 1, n)
23 
24     def isValid(self, columnPosition, rowindex):
25         # 不能有重复元素,如果有代表为同列
26         if len(set(columnPosition[:rowindex + 1])) != len(columnPosition[:rowindex + 1]):
27             return False
28         # 判断是否是在对角线
29         for i in range(rowindex):
30             if abs(columnPosition[i] - columnPosition[rowindex]) == int(rowindex - i):
31                 return False
32         return True
33 
34     def printSolution(self, columnPosition, n):
35         for row in range(n):
36             line = ""
37             for column in range(n):
38                 if columnPosition[row] == column:
39                     line += "Q\t"
40                 else:
41                     line += ".\t"
42             print(line, "\n")
43         print('\n')
44 
45 
46 solution().solveNQueens(8)

 



结果:

 

posted on 2021-02-26 15:27  前端里的一把火  阅读(93)  评论(0编辑  收藏  举报