【LeetCode】52。NクイーンII

1.タイトル

nクイーン問題は、n×nチェスボードにnクイーンを配置し、クイーンが互いに攻撃できないようにする方法を研究します。
女王
上の写真は、8つの女王の問題の解決策を示しています。

整数nが与えられた場合、n個のクイーンの異なる解の数を返します。

例:

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

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

促す:

  • 女王はチェスのポーンであり、王の妻を意味します。女王はただ一つのことをします、そしてそれは「子供を食べる」ことです。食べられるチェスに出会ったとき、彼女はすぐにそれを持って行きました。もちろん、彼女は水平、垂直、斜めに1歩またはN-1歩進むことができ、前進または後退することができます。(Baidu Encyclopedia-Queenから引用)

二、解く

1.直接戻る

アイデア:

既存のプログラムを使用して結果を直接計算し、それを配列に入れて、必要に応じて直接返します。少し注意が必要ですが、実際には2番目の方法と組み合わせてアクセスを高速化できます。

コード:

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];
}

時間の複雑さ: O(1)
空間の複雑さ: O(n)

2、DFS

アイデア:

行ごとにスキャンし、資格のないものをバックトラックします。詳しくは【LeetCode】51をご覧ください。Nクイーン

コード:

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;
        }
    }
}

時間の複雑さ: O(n!)、ここでnはクイーンの数です。
スペースの複雑さ: O(n)、再帰呼び出しレイヤーの数、最大nレイヤー。

3.ビット操作

アイデア:

理解するのは簡単ではありません、とりあえず脇に置いておきます。

コード:

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;  
  }
}

時間の複雑さ: O(?)O(?)O
スペースの複雑さ: O(?)O(?)

3、参照

1、受け入れられたJavaソリューション
2、最も簡単なJavaソリューション(1ms、98.22%)
3、Java
4のソリューションのコレクション、素晴らしいハック(特に新規ユーザーにとって非常に有益な場合があります)
5、Java AC、ビットM、98%以上、低スペース
6、JAVA-クリーンなビット単位の実装-100%を超える-0ms

おすすめ

転載: blog.csdn.net/HeavenDan/article/details/108564488