N皇后问题

给定一个整数 n,返回所有不同的 n 皇后问题的解决方案,每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。示例如下:

n皇后问题是使用回溯算法解决的经典问题,皇后们的约束条件:

1.不能同行

2.不能同列

3.不能走斜线

搜索皇后的位置可以抽象为一棵二叉树,二维矩阵的高就是数的高度,矩阵的宽度就是树形结构中每个点的宽度。只要到了叶子节点说明找到了皇后们的合理位置。

回溯三部曲:

(1)确定参数及返回值:返回类型为void型,参数n为棋盘大小,row记录到第几层。

(2)返回条件:当遍历到棋盘的最后一层,就可以收集结果并返回。

(3)单层搜索的逻辑:每一行每一列进行遍历确定皇后的位置。

此外需要验证棋盘是否合法。

实现代码如下:

//N皇后问题 
vector<vector<string>> result;

//n为输入的棋盘的大小
//row为遍历到第几行 
void backtracking(int n, int row, vector<string> chessboard) {
    //确定终止条件
    if(row == n) {
        result.push_back(chessboard);
        return;
    }
    //单层搜索的逻辑
    //row--行,col--列 
    for(int col = 0; col<n; col++) {
        if(isValid(row, col, chessboard, n)) {
            chessboard[row][col] = 'Q';
            backtracking(n, row+1,chessboard); //递归 
            chessboard[row][col] = '.';
        }
    } 
}

bool isValid(int row, int col, vector<string>& chessboard, int n) {
    //检查列
    for(int i = 0; i<row; i++) {
        if(chessboard[i][col] == 'Q') {
            return false;
        }
    }
    //检查45度斜边
    for(int i = row-1, j = col-1; i>=0 && j>=0; i--,j--) {
        if(chessboard[i][j] == 'Q') {
            return false;
        }
    }
    //检查135度角
    for(int i = row-1, j = col+1; i>=0 && j<n; i--,j++) {
        if(chessboard[i][j] == 'Q') {
            return false;
        }
    }
    return true;
}
vector<vector<string>> solveNQueens(int n) {
    result.clear();
    std::vector<std::string> chessboard(n,std::string (n,'.'));
    backtracking(n,0,chessboard);
    return result;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值