Loading

LeetCode 51 N皇后

LeetCode51 N皇后

题目描述

n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

image-20201110144305013.png

上图为 8 皇后问题的一种解法

给定一个整数 n,返回所有不同的 n 皇后问题的解决方案

每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q''.' 分别代表了皇后和空位。

样例

输入:4
输出:[
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]
解释: 4 皇后问题存在两个不同的解法

算法分析

  • 同一行、同一列、同主对角线、副对角线

image-20201110150004506.png

时间复杂度

Java代码

class Solution {
    static int N = 20;
    static boolean[] col = new boolean[N];
    static boolean[] dg = new boolean[2*N - 1];
    static boolean[] udg = new boolean[2*N -1];
    static char[][] g = new char[N][N];
    static List<List<String>> ans = new ArrayList<List<String>>();

    static void dfs(int y, int n){
        if(y == n){
           List<String> t = new ArrayList<String>();
           for(int i = 0; i < n; i ++){
               String temp = "";
               for(int j = 0; j < n; j ++){
                   temp += g[i][j];
               }
               t.add(temp);
           } 
           ans.add(t);
           return;
        }

        //一行中枚举的每一列
        for(int x = 0; x < n; x++){
            if(!col[x]&&!dg[y-x+n]&&!udg[y+x]){
                col[x] = dg[y-x+n] = udg[y+x] = true;
                g[y][x] = 'Q';
                dfs(y+1,n);
                col[x] = dg[y-x+n] = udg[y+x] = false;
                g[y][x] = '.';
            }
        }
    }

    public List<List<String>> solveNQueens(int n) {
        ans.clear();
        for(int i = 0; i < n; i ++){
            for(int j = 0; j < n; j ++){
                g[i][j] = '.';
            }
        }

        dfs(0,n);
        return ans;
    }
}
posted @ 2020-11-12 17:01  想用包子换论文  阅读(92)  评论(0)    收藏  举报