n皇后问题

n皇后问题

1.问题描述
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给定一个整数 n,返回 n 皇后不同的解决方案的数量。
2.解析
n个皇后放在n*n的棋盘上,则每行都必须有一个皇后。
从上到下依次尝试放置皇后,对于每一行,从左到右依次尝试。如果当前位置可放置,则完成本行放置,进行下一行皇后的放置;如果遍历完本行,则进行回溯,返回上一行的皇后放置。
3.代码

class Solution {
int totalSolve = 0;
int QueueNum=0;
vector<vector<int>> chess;
public:
    int totalNQueens(int n) {
        QueueNum = n;
        chess = vector<vector<int>> (n,vector<int>(n));
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                chess[i][j] = 0;
        setQueue(0);
        return totalSolve;
    }

    void setQueue(int x){
        if(x >= QueueNum){
            totalSolve ++;
            return;
        }
        for(int y =0 ; y<QueueNum;y++){
            //判断当前位置否放置,如果能够放置,则放
            if(judge(x,y)){
                chess[x][y] = 1;
                //下一行
                setQueue(x+1);
                chess[x][y] = 0 ;
            }
        }
    }
    bool judge(int x, int y){
        bool flag = true;
        int temp1=y,temp3=y;
        while(--x>=0){
            if(x>=0){
                temp1--;
                temp3++;
                if(temp1>=0 && chess[x][temp1]==1){
                    flag = false;
                    break;
                }
                if(chess[x][y]==1){
                    flag = false;
                    break;
                }
                if(temp3<QueueNum && chess[x][temp3] == 1){
                    flag = false;
                    break;
                }
            } 
        }
        return flag;
    }

};

4.leetcode运行结果
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值