LeetCode 51. N-Queens

51. N-Queens问题,主要是在使用dfs方法考虑。按照行搜索的方式来对列,主、副对角线来进行查找,分析是否有可以相互攻击的元素


java

class Solution {
    public List<List<String>> solveNQueens(int n) {
        List<List<String>> result = new ArrayList<>();
        if (n <= 0) {
            return result;
        }
        dfs(new boolean[n], new boolean[2 * n], new boolean[2 * n], 0, n, new ArrayList<String>(), result);
        return result;
    }
    private void dfs(boolean[] shu,
                     boolean[] pie,
                     boolean[] na,
                     int row, 
                     int n,
                     List<String> path,
                     List<List<String>> result) {
        if (row == n) {
            result.add(new ArrayList<String>(path));
            return;
        }
        for (int col = 0; col < n; col++) {
            int id1 = row + col;
            int id2 = n + col - row;
            if (shu[col] || pie[id1] || na[id2]) {
                continue;
            }
            char[] arr = new char[n];
            Arrays.fill(arr, '.');
            arr[col] = 'Q';
            shu[col] = true;
            pie[id1] = true;
            na[id2] = true;
            path.add(new String(arr));
            dfs(shu, pie, na, row + 1, n, path, result);
            path.remove(path.size() - 1);
            na[id2] = false;
            pie[id1] = false;
            shu[col] = false;
        }
    }
}

python

class Solution(object):
    def solveNQueens(self, n):
        """
        :type n: int
        :rtype: List[List[str]]
        """
        if n <= 0:
            return []
        result = []
        self.dfs([False] * n, [False] * n * 2, [False] * n * 2, 0, n, [], result)
        return result
        
    def dfs(self, shu, pie, na, row, n, path, result):
        if row == n:
            result.append(path[:])
            return
        for col in range(n):
            id1, id2 = col + row, n + col - row
            if shu[col] or pie[id1] or na[id2]:
                continue
            arr = ['.'] * n
            arr[col] = 'Q'
            shu[col], pie[id1], na[id2] = True, True, True
            path.append("".join(arr))
            self.dfs(shu, pie, na, row + 1, n, path, result)
            path.pop()
            shu[col], pie[id1], na[id2] = False, False, False
            
            
            
        



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ncst

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值