ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

回溯算法-N皇后问题

2021-02-26 15:34:50  阅读:226  来源: 互联网

标签:return rowindex self 回溯 range column 算法 columnPosition 皇后


什么是回溯:

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

场景描述:

保安部负责人小安面临一个问题,他需要在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)

 



结果:

 

标签:return,rowindex,self,回溯,range,column,算法,columnPosition,皇后
来源: https://www.cnblogs.com/suoni/p/14452528.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有