52. N-Queens II

Follow up for N-Queens problem.

Now, instead outputting board configurations, return the total number of distinct solutions.
这里写图片描述

思路:此题虽然是N皇后问题的变体,但还是可以用N皇后的思路去解决,只是用了一个set来存储合法的皇后

bool isNQueens(vector<int>& res){
    for (int i = 0; i < res.size(); i++){
        for (int j = i + 1; j < res.size(); j++){
            if (i - j == res[i] - res[j] || i - j == res[j] - res[i])return false;
        }
    }
    return true;
}

void dfs_SolveNQueens(vector<int>& res, int pos, set<vector<int>>& tt){
    if (pos == res.size()){
        if (isNQueens(res)){
            tt.insert(res);
        }
        return;
    }

    for (int i = pos; i < res.size(); i++){
        swap(res[i], res[pos]);
        dfs_SolveNQueens(res, pos + 1, tt);
        swap(res[i], res[pos]);
    }
}

int totalNQueens(int n){
    if (n == 0)return 0;
    vector<int> temp;
    for (int i = 0; i < n; i++)temp.push_back(i);
    set<vector<int>> res;
    dfs_SolveNQueens(temp, 0, res);
    return res.size();
}

思路1可能有重复的计算量

bool safe(vector<int>& res, int c){
    for (int i = 0; i < c; i++){
        if (res[i] == res[c] || abs(res[i] - res[c] == abs(i - c)))
            return false;
    }
    return true;
}

void dfs_SloveNQueens(int &cnt, vector<int>& res, int n, int c){
    if (c == n){
        cnt++;
        return;
    }
    for (res[c] = 0; res[c] < n; res[c]++){
        if (safe(res, c))dfs_SloveNQueens(cnt, res, n, c + 1);
    }
}
int totalNQueens(int n){
    vector<int> res(n);
    int cnt = 0;
    dfs_SloveNQueens(cnt, res, n, 0);
    return cnt;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值