LeetCode 051 N-Queens

题目是经典的n皇后问题。即在n乘n的国际象棋棋盘上放置n个皇后,让这些皇后互相不攻击到对方。

解法:
因为一行只能放置一个皇后,所以可以按行回溯求解。在回溯过程中可以快速判断当前位置是否可行:通过3个数组b,c,d来记录每列、每条右上到坐下的斜线、每条左上到右下的斜线是否存在皇后。(更快的是通过整数存储,使用位运算来判断)

代码:

class Solution {
public:
    int *a, *b, *c, *d;
    vector<string> sol;
    vector<vector<string>> result;

    void search(int i, int n) {
        if(i == n) {
            result.push_back(sol);
            return;
        }

        for(int k = 0 ; k < n ; k++) {
            if(!b[k] && !c[i + k] && !d[i - k + n - 1]) {
                b[k] = 1;
                c[i + k] = 1;
                d[i - k + n - 1] = 1;
                sol[i][k] = 'Q';
                search(i + 1, n);
                sol[i][k] = '.';
                b[k] = 0;
                c[i + k] = 0;
                d[i - k + n - 1] = 0;
            }
        }
    }

    vector<vector<string>> solveNQueens(int n) {
        a = new int[n];
        b = new int[n];
        c = new int[2*n];
        d = new int[2*n];
        memset(a, 0, sizeof(int) * n);
        memset(b, 0, sizeof(int) * n);
        memset(c, 0, sizeof(int) * 2 * n);
        memset(d, 0, sizeof(int) * 2 * n);

        string line;
        for(int j = 0 ; j < n ; j++)
            line += '.';

        for(int i = 0 ; i < n ; i++) {
            sol.push_back(line);
        }
        search(0, n);
        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值