N-Queens
来源:互联网 发布:mac pdf 导出图片 编辑:程序博客网 时间:2024/05/19 14:37
leetcode第51题,n皇后问题,在n*n的格子中防止n个皇后,使得每一行每一列和对角线都不能出现两个以上的皇后。
这其实就是著名的八皇后问题。
简单一点切入,假设我们放置第一个皇后,我们可以任意去选择位置,一共有n^2个位置,之后就是n^2-1个可能,以此类推,之后检查每种可能性是否合法,显然这个办法复杂度太高了。
换个角度,在放置的时候,我们就先验地加入规则限制。放置第一个皇后,可以在n行中任选一行,第二个皇后,因为不能同一行,所以只有n-1中可能了,另外还要满足列要求和对角线要求。
具体一点,我们逐行进行深搜。每次搜索时,都试探不同的列,看是否满足要求,对于满足要求的列扩展状态,继续下一行的递归搜索。当搜索到行数为n时,就拉出所有的搜索结果。
注意,这里我们维护一个list c作为棋盘的记录,c[i]=j代表了第i行中那j列有皇后。
class Solution(object): def solveNQueens(self, n): """ :type n: int :rtype: List[List[str]] """ def isvalid(c, row, col): for i in range(row): if c[i] == col: return False if abs(i-row)==abs(c[i]-col): return False return True def dfs(c, result, row): if row == n: solution = [] for i in range(n): s = ["."]*n print s for j in range(n): if c[i] == j: s[j] = "Q" s = "".join(s) solution.append(s) result.append(solution) for i in range(n): flag = isvalid(c, row, i) if not flag: continue c[row] = i dfs(c, result, row+1) c = [0*i for i in range(n)] result = [] dfs(c, result, 0) return result
阅读全文
0 0
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- caffe FCN Ubuntu16.0
- Servlet 过滤器
- LUOGU P2058 海港题解(附代码)
- 【实战】(二)android模拟qq登录(apache的httpClient发送get和post请求)
- Cohen's kappa coefficient
- N-Queens
- 微服务:Eureka+Zuul+Ribbon+Feign+Hystrix构建微服务架构
- 零点高级PS教程 第3期案实战例教程48节 价值1999元
- xsl笔记1
- 关于Coursera视频不能播放问题
- 基于人工智能的智能化地理信息系统
- 一些常见的专业英语词汇(02)
- Kindeditor编辑器添加图片上传水印功能(php代码)
- HTML新特性-网页排版