Название: п Исследование Куинз проблемы в том , как п Куинз помещается п × п на борту, и королева не могут атаковать друг друга друг с другом. Дано целое число п, возвращает все решения для различных задач Королева п. Каждый раствор содержит явные п части размещены программы маток проблемы, которую «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)