标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。