【回溯算法——N皇后】
本次复习的是回溯算法中的一道经典问题——N皇后问题对应leetcode 51.N皇后内容来源于代码随想录题目描述按照国际象棋的规则皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上并且使皇后彼此之间不能相互攻击。给你一个整数 n 返回所有不同的 n 皇后问题 的解决方案。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。思路首先要理解棋盘中的皇后的约束条件1. 不能同行 2. 不能同列 3. 不能同斜线回溯问题模板void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择本层集合中元素树中节点孩子的数量就是集合的大小) {处理节点;backtracking(路径选择列表); // 递归回溯撤销处理结果}}递归函数参数定义一个全局变量二维数组result记录最终收集到的结果定义n是棋盘大小row记录当前遍历到棋盘的第几层递归终止条件当递归到棋盘最底层也就是叶子节点的时候就可以收集结果并返回了单层搜索逻辑递归深度就是row控制棋盘的行每一层里for循环的col控制棋盘的列一行一列确定了放置皇后的位置。每次都是要从新的一行的起始位置开始搜所以都是从0开始。代码classSolution{public:vectorvectorstringresult;//n为输入的棋盘大小 row是当前递归到棋盘的第几行voidbacktracking(intn,introw,vectorstringchessboard){if(rown){result.push_back(chessboard);return;}for(intcol0;coln;col){if(isValid(row,col,chessboard,n)){//验证合法就可以放chessboard[row][col]Q;//放置皇后backtracking(n,row1,chessboard);chessboard[row][col].;//回溯撤销皇后}}}boolisValid(introw,intcol,vectorstringchessboard,intn){//检查列for(inti0;irow;i){if(chessboard[i][col]Q){returnfalse;}}//检查45°角是否有皇后for(intirow-1,jcol-1;i0j0;i--,j--){if(chessboard[i][j]Q){returnfalse;}}//检查135°角是否有皇后for(intirow-1,jcol1;i0jn;i--,j){if(chessboard[i][j]Q){returnfalse;}}returntrue;}vectorvectorstringsolveNQueens(intn){result.clear();std::vectorstd::stringchessboard(n,std::string(n,.));backtracking(n,0,chessboard);returnresult;}};
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2418854.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!