51. N 皇后


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

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-queens
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

import java.util.ArrayList;
import java.util.List;

class Solution {

    private static void solve(int LIMIT, List ret, int[] path, int index, int leftLimit, int rightLimit, int rowLimit) {
        if (index == path.length) {
            if (rowLimit == LIMIT) {
                int[] item = new int[path.length];
                System.arraycopy(path, 0, item, 0, path.length);
                ret.add(item);
            }
            return;
        }

        int leave = LIMIT & ~(leftLimit | rightLimit | rowLimit);

        while (leave > 0) {
            int lowbit = leave & -leave;
            path[index] = log2(lowbit);
            solve(LIMIT, ret, path, index + 1, (leftLimit | lowbit) << 1, (rightLimit | lowbit) >> 1, rowLimit | lowbit);

            leave -= lowbit;
        }

    }

    private static int log2(int x) {
        int ret = 0;
        while (x > 1) {
            x >>= 1;
            ret++;
        }
        return ret;
    }

    public static List> solveNQueens(int n) {
        List queens = new ArrayList<>();
        int[] path = new int[n];
        solve((1 << n) - 1, queens, path, 0, 0, 0, 0);
        List> ret = new ArrayList<>();

        for (int[] queen : queens) {
            List item = new ArrayList<>();
            for (int i = 0; i < n; ++i) {
                StringBuilder sb = new StringBuilder();
                for (int j = 0; j < queen[i]; ++j) {
                    sb.append(".");
                }
                sb.append("Q");
                for (int j = queen[i] + 1; j < n; ++j) {
                    sb.append(".");
                }
                item.add(sb.toString());
            }
            ret.add(item);
        }

        return ret;
    }
}

相关