边工作边刷题:70天一遍leetcode: day 29

N-Queen I

错误点:

  • 两个点在对角线上的比较条件:x坐标差和y坐标差相等
  • 在判断当前行和列是否valid的loop里不要做dfs
  • 因为是返回所有有效解,所以dfs为True不立即return,pass around结果list,在内层更新
  • python string和java string一样,immutable,所以不能set单个字符。用list之后join
class Solution(object):
    def solveNQueens(self, n):
        """
        :type n: int
        :rtype: List[List[str]]
        """
        def dfs(cols, rn, n, res, solutions):
            if rn>=n:
                resCp = list()
                for i in range(len(res)):
                    resCp.append(''.join(res[i]))
                solutions.append(resCp)
                return True
                
            for i in range(n):
                valid = True
                for k in range(rn):
                    if cols[k]==i or abs(cols[k]-i)==abs(k-rn):
                        valid = False
                        break
                
                if valid:
                    cols[rn]=i
                    res[rn][i]='Q'
                    dfs(cols, rn+1, n, res, solutions)
                    res[rn][i]='.'

            return False
        
        cols = [-1]*n
        res = [['.']*n for i in range(n)]
        solutions = []
        dfs(cols, 0, n, res, solutions)
        return solutions
        
原文地址:https://www.cnblogs.com/absolute/p/5678092.html