【LeetCode】 52. N Königin II

1. Titel

Das Problem mit n Königinnen untersucht, wie man n Königinnen auf ein n × n Schachbrett legt und die Königinnen unfähig macht, sich gegenseitig anzugreifen.
Königinnen
Das Bild oben zeigt eine Lösung für das 8 Queens-Problem.

Geben Sie bei einer Ganzzahl n die Anzahl der verschiedenen Lösungen für n Königinnen zurück.

Beispiel:

输入: 4
输出: 2
解释: 4 皇后问题存在如下两个不同的解法。
[
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]

prompt:

  • Die Königin ist der Bauer im Schach und bedeutet die Frau des Königs. Die Königin tut nur eines, und zwar "Kinder essen". Als sie eine Schachfigur traf, die man essen konnte, beeilte sie sich schnell, sie zu nehmen. Natürlich kann sie einen Schritt oder N-1 Schritte horizontal, vertikal und diagonal ausführen und vorwärts oder rückwärts gehen. (Zitiert aus Baidu Encyclopedia-Queen)

Zwei, lösen

1. Kehren Sie direkt zurück

Ideen:

Berechnen Sie das Ergebnis direkt mit dem vorhandenen Programm, fügen Sie es in das Array ein und geben Sie es bei Bedarf direkt zurück. Es ist etwas knifflig, kann aber tatsächlich mit der zweiten Methode kombiniert werden, um den Zugriff zu beschleunigen.

Code:

int totalNQueens(int n) {
    
    
    int ans[] = {
    
    1, 0, 0, 2, 10, 4, 40, 92, 352, 724, 2680, 14200, 73712, 365596, 2279184, 14772512, 95815104, 666090624};
    return ans[n - 1];
}

Zeitliche Komplexität: O (1)
Raumkomplexität: O (n)

2 、 DFS

Ideen:

Zeile für Zeile scannen, nicht qualifiziert zurückverfolgen. Weitere Einzelheiten finden Sie unter: 【LeetCode】 51. N Queen

Code:

class Solution {
    
    
    int cnt = 0;
    boolean[] cols;
    boolean[] diag1;
    boolean[] diag2;
    public int totalNQueens(int n) {
    
    
        cols = new boolean[n];
        diag1 = new boolean[2*n];
        diag2 = new boolean[2*n];
        DFS(0, n);
        return cnt;
    }

    private void DFS(int row, int n) {
    
    
        if (row==n) {
    
    
            cnt++;
        }
        for (int col=0; col<n; col++) {
    
    
            if (cols[col] || diag1[row-col+n] || diag2[row+col])  continue;
            cols[col]=true; diag1[row-col+n]=true; diag2[row+col]=true;
            DFS(row+1, n);
            cols[col]=false; diag1[row-col+n]=false; diag2[row+col]=false;
        }
    }
}

Zeitkomplexität: O (n!), Wobei n die Anzahl der Königinnen ist.
Raumkomplexität: O (n), die Anzahl der rekursiven Aufrufschichten bis zu n Schichten.

3. Bitbetrieb

Ideen:

Es ist nicht leicht zu verstehen, legen Sie es vorerst beiseite.

Code:

class Solution {
    
    
  
  private int size;
  private int count;

  private void solve(int row, int ld, int rd) {
    
    
    if (row == size) {
    
    
      count++;
      return;
    }
    int pos = size & (~(row | ld | rd));
    while (pos != 0) {
    
    
      int p = pos & (-pos);
      pos -= p;
      solve(row + p, (ld + p) << 1, (rd + p) >> 1);
    }
  }
  
  public int totalNQueens(int n) {
    
    
    count = 0;
    size = (1 << n) - 1;
    solve(0, 0, 0);
    return count;  
  }
}

Zeitliche Komplexität: O (?) O (?)O ( ? )
Raumkomplexität: O (?) O (?)Die ( ? )

Drei, Referenz

1 、Akzeptierte Java-Lösung
2 、Einfachste Java-Lösung (1 ms, 98,22%)
3 、Sammlung von Lösungen in Java
4 、Ein netter Hack (kann speziell für neue Benutzer sehr informativ sein)
5 、Java AC, Bit M, über 98%, Low Space
6 、JAVA - Bitweise Implementierung reinigen - 100% - 0 ms schlagen

Ich denke du magst

Origin blog.csdn.net/HeavenDan/article/details/108564488
Empfohlen
Rangfolge