[Una pregunta del día] 52. N-Queens II

Inserte la descripción de la imagen aquí

Esta explicación es más fácil de entender: el método de retroceso y el problema de la N-reina. El problema de la
N-reina. El tema significa que N reinas se colocan en el tablero de ajedrez N * N. Estas N reinas deben "vivir en paz". Si dos reinas están en la misma fila , La misma columna, o la misma diagonal, entonces las dos reinas lucharán.

Primero entendamos la solución de este problema de manera intuitiva. Coloque la reina desde la primera fila. Al colocar cada fila, debe verificar si la columna actual se puede colocar con la reina. Si se puede colocar, está bien, vaya a la siguiente fila. Si no se puede colocar, entonces Ingrese la siguiente columna de la fila y luego juzgue. Si la reina no se puede colocar hasta el final de la fila, regrese a la fila anterior, cambie la posición de la reina en la fila anterior y repita la operación anterior. Si puede ir a la última línea y colocar la reina, esta es una solución factible. Cuando la reina en la primera fila llega a la columna final, es el final de todo el proceso de búsqueda.

Las ideas de algoritmos son fáciles de entender, pero traducirlas a código no es tan fácil de escribir

Variables requeridas:

  • columna: Primero, necesitamos una matriz unidimensional para registrar la posición de la reina que se ha colocado. El subíndice del elemento de matriz representa el número de filas, y el valor del elemento de matriz representa la cantidad de columnas. Denote la matriz como columna
  • fila, columna: en qué fila y columna se encuentra la posición actual
  • total: registrar el número de soluciones
  • n: el número de reinas

paso:

  • La función auxiliar es OK (fila, columna): determina si la posición actual puede colocar una reina, atravesar la reina antes del número actual de filas, si hay una reina, el número de columnas es igual al número actual de columnas (la misma columna), o el valor absoluto del número de filas es igual a El valor absoluto de la diferencia en el número de columnas (la misma diagonal), lo que indica que entrará en conflicto
    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
  • Función principal: primero juzgue si la línea actual es la última línea, si lo es, agregue 1 a la solución, si no, encuentre la posición apropiada de la línea actual, si corresponde, ingrese la siguiente línea, si no es adecuada, continúe buscando. Si la línea no puede encontrar una posición adecuada, entonces el bucle actual termina y vuelve al bucle de cola de la línea anterior
    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)     # 进入下一行

El código completo es el siguiente:

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

Supongo que te gusta

Origin blog.csdn.net/SJTUKK/article/details/109133521
Recomendado
Clasificación