牛客网:N皇后问题

N皇后是个很经典的搜索问题。

我们用一个visit数组来记录对应行的列。即visit[i]=j,对应坐标(i,j)

思路如下所示:

按照行去递归,按照列去循环。

对于特定的一行row,我们对所有可能的列号row遍历,对于所选定的坐标(row,col),再判断其是否合法。

判断合法的思路就是,对这个行号之前的已经选定的坐标与当前可能产生的坐标依次判断是否在一行,一列或者是斜线。如果都没有,那就可以产生这个坐标,即visit[row]=col,接着递归下一行。

代码如下所示:

class Solution {
public:
    /**
     * 
     * @param n int整型 the n
     * @return int整型
     */
    
    bool isValid(vector<int> &visit, int row, int col){
        for(int i=0;i<row;++i){
            if(col==visit[i] || abs(col-visit[i])==abs(row-i)){
                return false;
            }
        }
        return true;
    }
    
    void NqueenCore(int row, vector<int> visit, int &res, int n){
        if(row==n){
            res++;
            return;
        }
        for(int col=0;col<n;++col){
            if(isValid(visit, row, col)){
                visit[row]=col;
                NqueenCore(row+1, visit, res,n);
                visit[row]=-1;
            }
        }
    }
    
    int Nqueen(int n) {
        // write code here
        int res=0;
        vector<int> visit(n, -1);
        NqueenCore(0, visit, res, n);
        return res;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值