51N Queen

Название: п  Исследование Куинз проблемы в том , как п  Куинз помещается п × п на борту, и королева не могут атаковать друг друга друг с другом. Дано целое число п, возвращает все решения для различных задач Королева п. Каждый раствор содержит явные п части размещены программы маток проблемы, которую «Q» и «» и пробел , представляющий королеву.
Источник: https: //leetcode-cn.com/problems/n-queens/

Закон один: свой собственный код для более чем 90 процентов

Идеи: официальный эталонный раствор, лечение возвратов основы реализации списка снова, ключ для удовлетворения проблем четыре условий, уровня использовать цикл для траверс, не будет повторяться, и два косые с р д достигается, с вертикальными смещ_по_столбцами записаны, эти четыре условия фактически обрезкой условия.

Класс Решение:
     Защита solveNQueens (самоповреждения, п: Int):
        Результаты = []
         DEF BackTrack (строка = -1, COL = 0):
             # прекращение назад условие, если в последней строке, указывая , чтобы найти решение, хранение 
            ПЧ ряд 1-п - ==. :
                Решение = []
                 для _ Col в отсортированных (маток):
                    solution.append ( ' ' * Col + ' Q ' + ' ' * (п - кол - 1 ))
                results.append (раствор)
                Возвращение 
            строки + = 1.
             для COL в диапазоне (n-):
                 # Если значение равно 0, что указывает можно поставить, 
                # IF условие здесь подрезать 
                IF перевалы [COL] + P [COL + Row] + Q [COL-Row] == 0:
                     # размещение ферзя 
                    queens.add ((строка, столбец))
                     # , где COLS эффекты , даже если запись на самом деле королева вертикального направления, 
                    # P, Q ферзя для того , чтобы запись , существует ли два наклонен 
                    # уровень цикл по направлению для использования, каждый набор до 0 после того, как в конце задней части , они не должны Queen 
                    # и так как эти объекты являются переменными, функция обратно после каждого вызова, изменить значение значений сохраняется после функции он необходим обратного прослеживания плюс счетчика команд 0 
                    # и строка и столбец являются неизменными объектами, обратно после каждого вызова функции, восстановит значение перед вызовом 
                    Cols [COL]. 1 = 
                    Р [Col+ строка] = 1 
                    д [Col -строка] = 1
                    откат (строка, столбец)
                    # Задний конец функции, удалить просто положить Queen, за цикл продолжается, позиция определяется 
                    queens.remove ((строка, столбец))
                    смещ_по_столбцам [Col] = 0
                    р [Col + строка] = 0
                    д [Col - строка] = 0
        смещ_по_столбцы = [0] * н-
         # Р регистрирует направление главной диагонали, д записывает суб диагонального направления 
        # р, д наблюдается при растягивая, введение Р, Q, чтобы отличить диагональное направление расположено после ферзя он не мог поместить Queen 
        P = [0] * (п-2 * -. 1 )
        Q = [0] * (п-2 * -. 1 )
         # потому , что не присоединяют поп список кортежей, он используется здесь SET 
        Queens = SET ()
        откат ()
        возвращать результаты
 , если  __name__ == ' __main__ ' :
    duixiang = Решение ()
    WW = duixiang.solveNQueens (4. )
     Печать ( ' результат: ' , WW)
Просмотр кода

Акт II: Официальное решение, очень четкие идеи с рядом функций для достижения модульных

# 官网питон代码
класс Решение:
     Защита solveNQueens (самоповреждения, п: целое):
         Защита could_place (строка, столбец):
             возврат  не (перевалы [Col] + hill_diagonals [строка - столбец] + dale_diagonals [строка + столбец])
         Защита place_queen ( строка, столбец):
            queens.add ((строка, столбец))
            смещ_по_столбцам [Col] = 1 
            hill_diagonals [строк - столбец] = 1 
            dale_diagonals [строка + цвет] = 1
         Защита remove_queen (строка, столбец):
            queens.remove ((строка, столбец))
            смещ_по_столбцам [Col] = 0
            hill_diagonals [строка - столбец] = 0
            dale_diagonals [строка + цвет] = 0
         четкости add_solution ():
            Решение = []
             для _ Col в отсортированных (маток):
                solution.append ( ' ' * Col + ' Q ' + ' ' * (п - кол - 1 ))
            output.append (раствор)
        Защита откат (строка = 0):
             для седловины в диапазоне (N):
                 если could_place (строка, столбец):
                    place_queen (строка, столбец)
                    если строка + 1 == п:
                        add_solution ()
                    еще :
                        BackTrack (Ряд + 1 )
                     # Целью этого является выполнение , когда задний конец функции, возврат в состояние перед вызовом 
                    remove_queen (строка, столбец)
        смещ_по_столбцы = [0] * п
        hill_diagonals = [0] * (2 * п - 1 )
        dale_diagonals = [0] * (2 * п - 1 )
        матки = множество ()
        Выход = []
        откат ()
        вернуть выход
 , если  __name__ == ' __main__ ' :
    duixiang = Решение ()
    WW = duixiang.solveNQueens (4. )
     Печать ( ' результат: ' , WW)
Просмотр кода

 

рекомендация

отwww.cnblogs.com/xxswkl/p/11968132.html
рекомендация