***(leetcode) N-Queens II

本文介绍了一种解决N皇后问题的方法,重点在于计算所有可能的解决方案数量而非输出具体的棋盘配置。通过递归算法和冲突检查确保皇后放置的有效性。

Follow up for N-Queens problem.

Now, instead outputting board configurations, return the total number of distinct solutions.


class Solution {
    bool canPut(int row, int list,int queens, int location[][100]){
        int p = row, q = list;
        for(int i = 0 ; i < row ; i++) //判断第row行皇后能否放在第list列
            if(location[i][list]==1)
                return false;
        while((--p>=0)&&(--q>=0))   //判断第(row,list)皇后是否与左上角斜线皇后冲突
            if(location[p][q]==1)
                return false;
        p = row;
        q = list;
        while((--p>=0)&&(++q<queens))//判断第(row,list)皇后是否与右上角斜线皇后冲突
            if(location[p][q]==1)
                return false;
        return true;
    }
    void funcation(int row, int queens, int location[][100], int &total){
        if(row>=queens)  return; 
        for(int i = 0 ; i < queens ; i++){
            if(canPut(row, i, queens, location)){ //判断该位置能否放置皇后
                if(row==queens-1){ //最后一行只有一个位置能放置皇后,so判断能后直接返回即可
                  total++;
                  return;
                }
                location[row][i] = 1; //将皇后放在该列
                funcation(row+1, queens, location, total); //进入下一个皇后位置判断
                location[row][i] = 0; //将皇后位置还原
            }
            
        }
    }
public:
    int totalNQueens(int n) {
        int total = 0 ;
        int location[100][100];
        memset(location, 0, sizeof(location));
        funcation(0, n, location, total);
        return total;
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值