タイトル:nは 研究クイーン問題はどのようにあるn個 置かクイーンズのn × nはボード上の、そして女王はお互いにお互いを攻撃することはできません。整数nが与えられ、Nの女王の異なる問題にすべての解を返します。各溶液は、明示的なn個配置されたクイーン問題のプログラム、「Q」と「」、クイーンを表すギャップを含んでいます。
出典ます。https://leetcode-cn.com/problems/n-queens/
1幕:90%以上のために独自のコードを
アイデア:公式の標準溶液、リストの実現の治療の後戻りの枠組み再び、キーは4つの条件の問題を満たすためにある、レベルがトラバースへのforループを使用することで、Pで繰り返され、2つの傾斜されることはありませんqは垂直COLSを記録して、これら4つの条件は、実際の条件をプルーニングされ、達成されます。
クラスソリューション: DEF solveNQueens(セルフ、N-ます。int): 結果 = [] DEFバックトラック(行= -1、COL = 0):# のバック終了条件、最後の行であれば、解決策を見つけるために示し、ストレージ IF行1-N - == : ソリューション = [] のため _、COL にソート(クイーンズ): solution.append(' ' * COL + ' Q ' + ' ' *(N - - COL 1 )) results.append(ソリューション)リターン 行 + = 1。 ため COL におけるレンジ(N): #0に等しい場合、それは置くことができる示し、 #ここで条件はプルーニングする場合 IF colsの[COL] + P [COL +行] + Q [COL-行] == 0 : #はクイーン配置 queens.add((行、COL)) #記録が実際クイーン垂直方向にある場合でもcolsの効果を #2斜めに存在するか否かを記録するためにP、クイーンQ #水平方向にバックエンドの後に0に各セットをループするために使用して、そうしてください何の女王が存在しないこと #は、これらのオブジェクトが可変であるため、機能のバック各コールの終了後、値の値がまだ存在して変更する、それが機能を加えた後に戻って行く必要がありますSRE 0プログラム #行およびCOL各コールバック関数を呼び出す前の値を復元された後に、不変オブジェクトである [COL] COLSを1 = P [COL +行] = 1 Q [COL行×] = 1 バックトラック(行、COL) #関数をバックトラックした後、クイーンだけ採取場所、およびループが継続するため、次の位置が決定される queens.remove((行、COL)) COLS [COL] = 0 P [COL +ロウ] = 0 Q [COL -行] = 0 COLS = [0] * N - #P主対角線方向を記録し、qはサブ対角線方向レコード #Pを、Qは、引き出しによって観察されます、Pの導入は、Qはクイーンが対角線方向クイーンに配置することができないと区別するために配置されている - P = [0] *(1、N-2 * ) Q - = [0] *(1、N-2 * ) #リストはできないため追記ポップタプル、それがで設定されています、 クイーンズ= セット() バックトラック() 戻り結果 場合 __name__ == ' __main__ ' : duixiang = ソリューション() WW = duixiang.solveNQueens(4 ) 印刷(' 结果是:'、WW)
アクトII:公式のソリューションは、多くの機能を持つ非常に明確なアイデアは、モジュラーを達成するために
#官网パイソン代码 クラスソリューション: DEF solveNQueens(自己、N:INT): DEF could_place(行、列): 復帰 しない(COLS [COL] + hill_diagonals [行- COL] + [行+ dale_diagonals COL])が DEF place_queen(行、列): queens.add((行、列)) COLS [COL] = 1 hill_diagonals [行 - COL = 1 dale_diagonals [行 + COL = 1 DEF remove_queen(行、列): queens.remove((行、列)) COLS [COL] = 0 hill_diagonals [行 - COL = 0 dale_diagonals [行 + COL = 0 DEF add_solution(): 溶液 = [] のため _、COL にソート(クイーン): solution.append(' ' * COL + ' Q ' + ' 。' *(N - COL - 1 )) output.append(溶液)DEFバックトラック(行= 0): のために COL における範囲(N): もし could_place(行、列)。 place_queen(行、COL) IF行+ 1 ==。N-: add_solution() 他: バックトラック(行。+ 1 ) #1 オブジェクトが実行され、この関数が返すのバックエンドコール前の状態 remove_queen(行、COL) COLS = [0] * N- hill_diagonals = [0] *(2 * N - 1 ) dale_diagonals = [0] *(2 * N - 1 ) クイーンズ = SET() 出力 = [] バックトラック() リターン出力 IF __name__== ' __main__ ' : duixiang = ソリューション() WW = duixiang.solveNQueens(4 ) 印刷(' 結果:'、WW)