クイーンleetcode-51-N

件名の説明:

 

 

 

 最初の投稿:後戻り:

クラスのソリューション:
     DEF solveNQueens(自己、N:整数) - > 一覧[一覧[STR]]:
        サブ(文字列、P、C):
            新しい = [S の文字列] 
            新しい[p]は = Cの
             リターンを '' (新).join
         DEF :(I、J、ボード)を確認
             するために、X における範囲(N):
                 場合ボードは、[X] [J] == " Q " 返すのために X  -1,1 []
                 のための Y  [-1,1 :] 
                    I1 = I + X 
                    J1 = J + Y
                     ながら <= I1 <N 0 および 0 <= J1 < N:
                         もしボード[I1] [J1] == " Q " 返すFalseの
                         
                            I1 + = X 
                            J1 + = Yの
             リターン真の
         デフバックトラック(I、ボード):
             もし I == N:
                res.append(board.copy())
                のリターン
            のために J レンジ(N):
                 もしチェック(I、J、ボード):
                    ボード[I] =サブ(基板[i]は、J、" Q " 
                    バックトラック(I +1 、基板)
                    基板[I] =サブ(ボード[i]は、jは、" " を返す
        RES = [] 
        ボード = [ " " * Nを
 _ 範囲(N)] 
        バックトラック(0、ボード)
        戻り RES

最適化:O(N!)

クラスのソリューション:
     DEF solveNQueens(自己、N:整数) - > :リスト[一覧[STR] 
        RES = [] 
        のS = " " * nは
         デフバックトラック(I、TMP、COL、z_diagonal、f_diagonal):
             もし私= = N:
                res.append(TMP)のリターンのための J レンジ(N):
                 もし J しない COL 及び I + jがない   z_diagonal  I - J しない
                 
               f_diagonal:
                    バックトラック(I + 1、TMP + [S [:J] + " Q " + S [j + 1]、COL | {J}、z_diagonal | {iがjは+}、f_diagonal | {I - J })
            
        バックトラックし、()、(0、[]、(設定)を設定())     
        戻り RES

 

おすすめ

転載: www.cnblogs.com/oldby/p/11697714.html