件名の説明:
最初の投稿:後戻り:
クラスのソリューション: 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