51N女王

タイトル: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)
コードの表示

 

おすすめ

転載: www.cnblogs.com/xxswkl/p/11968132.html
おすすめ