[Один вопрос дня] 52. N-Queens II

Вставьте описание изображения сюда

Это объяснение легче понять: метод возврата и проблема
N ферзей. Проблема N ферзей. Тема означает, что N ферзей размещены на шахматной доске N * N. Эти N ферзей должны «жить в мире». Если какие-либо две ферзя находятся в одном ряду , Тот же столбец или та же диагональ, тогда две ферзя будут сражаться.

Давайте разберемся с решением этой проблемы интуитивно. Начните ставить ферзя с первого ряда. При размещении каждого ряда нужно проверять, можно ли поставить ферзя в текущий столбец. Войдите в следующий столбец ряда и затем оцените.Если ферзь не может быть помещен до конца ряда, вернитесь к предыдущему ряду, измените положение ферзя в предыдущем ряду и повторите описанную выше операцию. Если вы можете перейти к последней строчке и поставить ферзя, это реальное решение. Когда ферзь в первой строке достигает конечного столбца, это означает конец всего процесса поиска.

Идеи алгоритмов легко понять, но воплотить их в коде не так-то просто.

Обязательные переменные:

  • столбец: Во-первых, нам нужен одномерный массив для записи положения размещенного ферзя. Нижний индекс элемента массива указывает количество строк, а значение элемента массива указывает количество столбцов. Обозначьте массив как столбец
  • row, col: в какой строке и столбце находится текущая позиция
  • всего: запишите количество решений
  • n: количество ферзей

шаг:

  • Вспомогательная функция isOK (row, col): определяет, может ли текущая позиция разместить ферзя, пройти ферзя перед текущим количеством строк, если ферзь есть, количество столбцов равно текущему количеству столбцов (тот же столбец), или абсолютное значение количества строк равно Абсолютное значение разницы в количестве столбцов (одинаковой диагонали), указывающее на конфликт.
    def isOk(self,row, col):
        for i in range(0, row):
            if(col == self.column[i] or abs(row - i) == abs(col - self.column[i])):
                return False
        return True
  • Основная функция: сначала оценить, является ли текущая строка последней строкой, если это так, добавить 1 к решению, если нет, найти подходящую позицию текущей строки, если необходимо, ввести следующую строку, если не подходит, продолжить поиск. Если строка не может найти подходящую позицию, то текущий цикл завершается и возвращается к циклу очереди предыдущей строки.
    def queue(self, row):
       if(row == self.n): 
           self.total += 1
       else:
           for col in range(0, self.n):
               self.column[row] = col 
               if(self.isOk(row, col)):
                   self.queue(row + 1)     # 进入下一行

Полный код выглядит следующим образом:

class Solution:
    def isOk(self,row, col):
        for i in range(0, row):
            if(col == self.column[i] or abs(row - i) == abs(col - self.column[i])):
                return False
        return True

    def queue(self, row):
        if(row == self.n):
            self.total += 1
        else:
            for col in range(0, self.n):
                self.column[row] = col
                if(self.isOk(row, col)):
                    self.queue(row + 1)

    def totalNQueens(self, n: int) -> int:
        self.total = 0
        self.n = n
        self.column = [0] * self.n
        self.queue(0)
        return self.total

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

отblog.csdn.net/SJTUKK/article/details/109133521