leetcode 51. N皇后

1267 ワード

https://leetcode-cn.com/probl...
3つのタグ配列を定義します.
  • colは、各カラムが占有されているかどうかを示し、ブールタイプ
  • ul 2 dr左上から右下の斜線が占有されているかどうか、長さは2× n-1,アンダースケール変換:i=x-y+n-1,この斜線では横長座標の差が
  • 固定されているため
  • ur 2 dl右上から左下の斜線が占有されているかどうか、長さは2× n−1,下付きスケーリング:i=x+y,この対角線上では横長座標の和が固定された
  • であるため
    class Solution:
        def solveNQueens(self, n: int) -> List[List[str]]:
            mp = [['.']*n for i in range(n)]
            col = [False] * n
            ul2dr = [0] * (n*2-1)
            ur2dl = [0] * (n*2-1)
            ans = []
            def dfs(i):
                if i == n:
                    ans.append([''.join(x) for x in mp])
                for j in range(n):
                    pos1 = i - j + n - 1
                    pos2 = i + j
                    if not col[j] and ul2dr[pos1] == 0 and ur2dl[pos2] == 0: #        
                        col[j] = True
                        ul2dr[pos1] += 1
                        ur2dl[pos2] += 1
                        mp[i][j] = 'Q'
                        dfs(i+1)
                        mp[i][j] = '.'
                        col[j] = False
                        ul2dr[pos1] -= 1
                        ur2dl[pos2] -= 1
            dfs(0)
            return ans