[Eine Frage des Tages] 52. N-Queens II

Fügen Sie hier eine Bildbeschreibung ein

Diese Erklärung ist leichter zu verstehen: die Backtracking-Methode und das N-Queen-Problem. Das
N-Queen-Problem. Das Thema bedeutet, dass N Königinnen auf dem N * N-Schachbrett platziert werden. Diese N Königinnen müssen "in Frieden leben". Wenn sich zwei Königinnen in derselben Reihe befinden , Die gleiche Säule oder die gleiche Diagonale, dann kämpfen die beiden Königinnen.

Lassen Sie uns zunächst die Lösung dieses Problems intuitiv verstehen. Platzieren Sie die Dame aus der ersten Reihe. Wenn Sie jede Reihe platzieren, müssen Sie überprüfen, ob die aktuelle Spalte mit der Königin platziert werden kann. Wenn sie platziert werden kann, OK, fahren Sie mit der nächsten Zeile fort. Wenn sie nicht platziert werden kann, dann Geben Sie die nächste Spalte der Reihe ein und beurteilen Sie dann. Wenn die Königin nicht bis zum Ende der Reihe platziert werden kann, kehren Sie zur vorherigen Reihe zurück, ändern Sie die Position der Königin in der vorherigen Reihe und wiederholen Sie den obigen Vorgang. Wenn Sie zur letzten Zeile gehen und die Königin platzieren können, ist dies eine praktikable Lösung. Wenn die Königin in der ersten Zeile die Endspalte erreicht, ist der gesamte Suchvorgang beendet.

Algorithmusideen sind leicht zu verstehen, aber ihre Übersetzung in Code ist nicht so einfach zu schreiben

Erforderliche Variablen:

  • Spalte: Zunächst benötigen wir ein eindimensionales Array, um die Position der platzierten Königin aufzuzeichnen. Der Index des Array-Elements gibt die Anzahl der Zeilen an, und der Wert des Array-Elements gibt die Anzahl der Spalten an. Bezeichnen Sie das Array als Spalte
  • row, col: In welcher Zeile und Spalte sich die aktuelle Position befindet
  • total: Notieren Sie die Anzahl der Lösungen
  • n: die Anzahl der Königinnen

Schritt:

  • Hilfsfunktion isOK (row, col): Bestimmen Sie, ob die aktuelle Position eine Queen platzieren kann, durchlaufen Sie die Queen vor der aktuellen Anzahl von Zeilen. Wenn es eine Queen gibt, entspricht die Anzahl der Spalten der aktuellen Anzahl der Spalten (dieselbe Spalte) oder der absolute Wert der Anzahl der Zeilen Der absolute Wert der Differenz in der Anzahl der Spalten (gleiche Diagonale), der angibt, dass ein Konflikt auftritt
    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
  • Hauptfunktion: Zuerst beurteilen, ob die aktuelle Zeile die letzte Zeile ist. Wenn dies der Fall ist, 1 zur Lösung hinzufügen. Wenn nicht, die entsprechende Position der aktuellen Zeile ermitteln. Gegebenenfalls die nächste Zeile eingeben. Falls nicht geeignet. Weiter suchen. Wenn die Leitung keine geeignete Position finden kann, endet die aktuelle Schleife und fällt auf die Warteschlangenschleife der vorherigen Zeile zurück
    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)     # 进入下一行

Der vollständige Code lautet wie folgt:

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

Ich denke du magst

Origin blog.csdn.net/SJTUKK/article/details/109133521
Empfohlen
Rangfolge