51. N皇后

class Solution {
    Set<Integer> lie = new HashSet<>();
    Set<Integer> pie = new HashSet<>();
    Set<Integer> na = new HashSet<>();
    List<List<Integer>> result = new ArrayList<>();

    public List<List<String>> solveNQueens(int n) {
        List<Integer> curr = new ArrayList<>();
        dfs(0, curr, n);
        return get_pic(result, n);
    }

    // 通过列丿捺的集合判别是否可以落子
    public void dfs(int i, List<Integer> currCopy, int n) {
        List<Integer> curr = new ArrayList<>(currCopy);
        if (i >= n) {
            result.add(curr);
            return;
        }

        for (int j = 0; j < n; j++) {
            if (lie.contains(j) || pie.contains(i+j) || na.contains(i-j))
                continue;
            
            lie.add(j);
            pie.add(i + j);
            na.add(i - j);
            List<Integer> currTemp = new ArrayList<>(curr);
            currTemp.add(j);
            dfs(i + 1, currTemp, n);
            lie.remove(j);
            pie.remove(i + j);
            na.remove(i - j);
        }
    }

    // 把得到的结果以String的形式打印出来
    public List<List<String>> get_pic(List<List<Integer>> result, int n) {
        List<List<String>> resList = new ArrayList<>();
        for (int i = 0; i < result.size(); i++) {
            List<String> res = new ArrayList<>();
            for(int j = 0; j < n; j++) {
                Integer k= result.get(i).get(j);
                String temp = String.join("", Collections.nCopies(k, "."));
                temp += "Q";
                temp += String.join("", Collections.nCopies(n - k -1, "."));
                res.add(temp);
            }
            resList.add(res);
        }
        return resList;
    }
}

注:

1. 思路比较简单,就是判断是不是在列撇捺的集合里面,不在就满足条件

2. 这个是改写的别人的python的版本,但是涉计到list的copy问题还是string的"."的打印,用java会比较麻烦。效率比较低,胜在好理解。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值