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
原创粉丝点击