Java教程

面试题 08.12. 八皇后

本文主要是介绍面试题 08.12. 八皇后,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线上。这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。

注意:本题相对原题做了扩展

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

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

class Solution {

    private List<List<String>> ans = new ArrayList<>();

    private LinkedList<Integer> path = new LinkedList<>();

    private void add() {
        List<String> item = new ArrayList<>();
        for (int x : path) {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < x; ++i) {
                sb.append(".");
            }
            sb.append("Q");
            for (int i = x + 1; i < path.size(); ++i) {
                sb.append(".");
            }
            item.add(sb.toString());
        }
        ans.add(item);
    }

    private int log2(int x) {
        return (int) (Math.log(x) / Math.log(2) + 0.5);
    }

    private void solve(int LIMIT, int rowLimit, int leftLimit, int rightLimit) {
        if (rowLimit == LIMIT) {
            add();
            return;
        }
        int allow = LIMIT & (~(rowLimit | leftLimit | rightLimit));
        while (allow > 0) {
            int lowbit = allow & (-allow);
            path.offerLast(log2(lowbit));
            solve(LIMIT, rowLimit | lowbit, (leftLimit | lowbit) << 1, (rightLimit | lowbit) >> 1);
            allow -= lowbit;
            path.pollLast();
        }
    }

    public List<List<String>> solveNQueens(int n) {
        solve((1 << n) - 1, 0, 0, 0);
        return ans;
    }
}
这篇关于面试题 08.12. 八皇后的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!