LeetCode 51.N-Queens

LeetCode 51.N-Queens ()

题目

链接

https://leetcode-cn.com/problems/n-queens/

问题描述

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

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

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

示例

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

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

提示

1 <= n <= 9

思路

这题的思路和之前的N皇后II一样,都是运用回溯法。

复杂度分析

时间复杂度 O(n!)
空间复杂度 O(n)

代码

Java

    static List<List<String>> ans = new ArrayList<>();
    static int[] queen;

    public static List<List<String>> solveNQueens(int n) {
        queen = new int[n];
        place(0, n);
        return ans;
    }

    public static List<String> getans(int n) {
        List<String> tmp = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            StringBuffer s = new StringBuffer();
            for (int j = 0; j < queen[i]; j++) {
                s.append(".");
            }
            s.append("Q");
            for (int j = queen[i] + 1; j < n; j++) {
                s.append(".");
            }
            tmp.add(s.toString());
        }
        return tmp;
    }

    public static void place(int t, int n) {
        if (t == n) {
            ans.add(getans(n));
            return;
        }
        for (int i = 0; i < n; i++) {
            if (check(t, i, n)) {
                queen[t] = i;
                place(t + 1, n);
                queen[t] = 0;
            }
        }
    }

    public static boolean check(int t, int x, int n) {
        for (int i = 0; i < t; i++) {
            if (queen[i] == x || queen[i] == x - t + i || queen[i] == x + t - i) {
                return false;
            }
        }
        return true;
    }
posted @ 2019-05-20 09:02  cheng102e  阅读(150)  评论(0编辑  收藏  举报