首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++ Queen中的n皇后回溯

C++ Queen中的n皇后回溯是一种经典的算法问题,用于解决在n×n的棋盘上放置n个皇后,使得它们互相之间不能攻击到对方的情况。回溯算法是一种穷举搜索的方法,通过逐步尝试所有可能的解决方案,并在不满足条件时进行回溯,寻找其他可能的解决方案。

在n皇后问题中,回溯算法的基本思路是逐行放置皇后,每次在当前行的每个位置尝试放置皇后,并检查是否与之前已放置的皇后冲突。如果冲突,则回溯到上一行,尝试其他位置。直到找到一个合法的解决方案或者所有可能的情况都尝试完毕。

该问题的解决方案可以通过递归实现,具体步骤如下:

  1. 定义一个二维数组board,表示棋盘,初始化所有元素为0。
  2. 定义一个递归函数solveNQueens,参数为当前行数row。
  3. 在solveNQueens函数中,遍历当前行的每个位置col。
  4. 检查当前位置是否与之前已放置的皇后冲突,如果冲突则跳过该位置。
  5. 如果当前位置不冲突,则将该位置标记为皇后(1),并递归调用solveNQueens函数解决下一行。
  6. 如果递归调用solveNQueens函数返回true,表示找到了一个解决方案,将该方案添加到结果集中。
  7. 回溯到上一行,将当前位置重新标记为0,继续尝试下一个位置。
  8. 当所有位置都尝试完毕后,返回结果集。

该算法的时间复杂度为O(n!),因为需要尝试n^n个位置,并且每个位置都需要检查之前已放置的皇后是否冲突。空间复杂度为O(n),因为需要额外的空间存储结果集和当前棋盘状态。

推荐的腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

n皇后 回溯

回溯思想 回溯算法实际上一个类似枚举搜索尝试过程,主要是在搜索尝试过程寻找问题解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。...但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走技术为回溯法,而满足回溯条件某个状态点称为“回溯点”。...许多复杂,规模较大问题都可以使用回溯法,有“通用解题方法”美称。...我个人理解就是不断地去尝试,满足条件便一直深入下去尝试,直到出现不满足情况时或则得到答案时便返回上一层 n皇后 n皇后问题就是在n*n棋盘上放置n皇后,使得n皇后两两之间不能进行攻击(即每两个皇后不可以在同一行...,同一列,在同一斜线上(斜率为1斜线)) 问题解析 n皇后问题就是依次将每个皇后放在棋盘某个位置,每次放置时要判断这个位置是否可以放置皇后,判断方式就是对已放置皇后坐标进行对比并且验证将要放置皇后是否满足互不攻击条件

16710

LeetCode N皇后(回溯)

n 皇后问题研究是如何将 n 个皇后放置在 n×n 棋盘上,并且使皇后彼此之间不能相互攻击。 上图为 8 皇后问题一种解法。 给定一个整数 n,返回所有不同 n 皇后问题解决方案。...每一种解法包含一个明确 n 皇后问题棋子放置方案,该方案 'Q' 和 '.' 分别代表了皇后和空位。 示例: 输入:4 输出:[ [".Q.....", "...Q", ".Q.."] ] 解释: 4 皇后问题存在两个不同解法。 提示: 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。...来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/n-queens 经典回溯+递归问题,当发现这种情况不行时就回溯到之前点。...代码: class Solution { public: int col[12] = {};//将合适皇后行数放入数组 vector> arr;

26330

回溯求解N皇后问题

前期尝试过8皇后问题,虽然最后完成了求解,但过程其实是比较懵圈 最近学习了“图”数据结构相关知识,对深度优先和广度优先有了全新认识,所以重新用DPS递归加回溯求解八皇后问题,并将之推广到N皇后。...基本思路: 构建N皇后求解结果数据结构,因为N皇后必然是N每行一个,而只需遍历求解纵坐标,所以定义N皇后结果数据结构为一个 len= N 列表,用于存储第N皇后纵坐标; 实现一个判断函数,...用于对给定结果列表判断是否满足N皇后共存,返回bool值; 递归实现一个N皇后求解函数,在已有共存皇后坐标基础上,增加一个新皇后纵坐标,且遍历该纵坐标为0~N-1,并逐个调用判断函数,看增加了新皇后之后是否共存...: 若共存,则在求解增加该位置值, 若此时已经完成了N皇后设计,则保存当前结果 若完成皇后个数<N,则在此基础上递归调用N皇后求解函数。...无论当前是否共存,都将新加入皇后位置弹出,来寻求新结果。 实现了一个显示N皇后共存结果函数,打印显示,便于可视化验证。

44120

回溯法之n皇后问题总结_用回溯法求解n皇后问题思路

其中x[i]表示皇后i放在棋盘第i行第x[i]列。由于不允许将2个皇后放在同一列,所以解向量x[i]互不相同。2个皇后不能放在同一斜线上是问题隐约束。...四皇后问题解空间树是一个完全4叉树,树根结点表示搜索初始状态,对应Backtrack(1,x);从根结点到第2层结点对应皇后1在棋盘第1行可能摆放位置,从第2层结点到第3层结点对应皇后2在棋盘第...完全4叉树,我只画了一部分,完整应该是除了叶结点,每个内部结点都有四个子结点,k表示层数: 剪枝之后: 回溯法求解4皇后问题搜索过程: 当然这个图只表示到找到第一个解,我们知道还有另外一个解...三、c++代码 变量sum记录可行方案个数,初始为1; n表示皇后个数,由用户输入; x[]数组保存问题解,表示皇后i放在棋盘第i行第x[i]列,初始时各元素都为0,而我们目的是求出有多少组(x[1..."); return 0; } 以上程序易于理解,但如果表示成非递归方式,可进一步省去O(n)递归栈空间,使用非递归迭代回溯法: #include #include

3.2K10

回溯法(一)——n皇后问题

问题描述 在一个n*n棋盘上放置皇后,要求:一个皇后同一行、同一列、同一条对角线上不允许出现其他皇后。请给出所有的放置方案。...算法思路 思路很简单,由于每行每列不能出现两个皇后,因此每行只能放一个皇后,那么第i行皇后究竟应该放哪儿呢?...若i行所有的位置都不满足,则回溯,将i-1行皇后位置往后移动,直到找到一个合理位置,再继续从前往后寻找i行位置。 示例 求解4皇后问题。...下标表示行号; result[i]表示第i行皇后列号。...代码实现 /** * N皇后问题 * @param n 矩阵规模 * @param i 行号 * @param result 皇后结果集(下标表示行号,值表示列号) */ void NQueen

1.5K130

n皇后问题-回溯法求解

n皇后问题-回溯法求解 1.算法描述 在n×n国际象棋上摆放n皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 n皇后是由八皇后问题演变而来。...最后一个不满足,回溯到上一行, 选下个位置,继续试探。 其实并不需要一个n*n数组,我们只需要一个n长度数组来存位置。 表示方式: arr[i] = k; 表示: 第i行第k个位置放一个皇后。...这样一个arr[n]数组就可以表示一个可行解, 由于回溯,我们就可以求所有解。 2.3 n皇后回溯求解 因为八皇后不能在同行,同列, 同斜线。 每一行放一个皇后,就解决了不在同行问题。...row + 1 } } 2.4 时间复杂度 最坏情况: 每一行有n种情况,有n行, 所以时间复杂度为O(n^n)。 但是由于回溯法会提前判断并抛弃一些情况,使得时间复杂度并没有想象那么高。...但是说是O(n!)也不太对,具体怎么算,暂时也不太清楚。(之前想当然了,此处有修正,多谢评论提醒。)

1.5K20

回溯算法之N皇后问题

问题描述 什么是皇后问题(有一定了解可以直接跳过这个部分看求解部分哦) 八皇后问题(英文:Eight queens),是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出问题,是回溯算法典型案例。...] 表示第 i 个皇后被放置到了第 putInf[i] + 1 列上(putInf数组存储是列号,范围为 0 ~ N – 1); 3.第二个条件:各皇后不同列, N 皇后放在 N x N 棋盘上,...给你一个整数 n ,返回所有不同 n 皇后问题 解决方案。 每一种解法包含一个不同 n 皇后问题 棋子放置方案,该方案 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。...); put.resize(n, -1);//初始化3个容器 dfs(0, n); return res; } }; 在这里巧妙之处是: 利用了循环顺序性消除了第一层限制: 同一行不可以存在两个皇后...第三条限制则是在回溯算法核心部分体现: //当前列无皇后,试探性摆放 for (j = 0; j < depth; j++) { //检测前 depth - 1行是否发生冲突 if (abs(j

92120

n皇后问题 回溯法java_Java解决N皇后问题

大家好,又见面了,我是你们朋友全栈君。 问题描述: 要求在一个n×n棋盘上放置n皇后,使得它们彼此不受攻击。...按照国际象棋规则,一个皇后可以攻击与之同一行或同一列或同一斜线上任何棋子。 因此,n皇后问题等价于:要求在一个n×n棋盘上放置n皇后,使得任意两个皇后不在同一行或同一列或同一斜线上。...一个皇后攻击范围: n皇后解空间—完全n叉树: 要找出“四皇后”问题解,最可靠方法就是把各种情况都分析一遍,将符合条件解找出来。但这样做十分地费时间。...采用回溯算法进行求解,在搜索过程,将不满足条件要求分支树剪去,可以有效地降低算法时间复杂度。...N皇后都存在于链表,才算得到了一个解: /** * 判断位置为loc皇后是否合法 */ private static boolean isLegalLoc(LinkedList

73140

Day17-递归&回溯-N皇后

,便于回溯时,选择其他位置信息。...)递归处理下一行,即重复(2)(3)步骤 (5)一行一行往下递归,当发现还没到最后一行时,此时棋盘上已无法再放入皇后,则进行回溯,根据之前镜像棋盘信息,再选择其他位置,放入皇后.../保存此时棋盘上皇后占位情况,便于回溯至此 location[k][i] = 'Q';//字符串数组location,皇后位置放入Q LocationOccupiedByQueen...,依然有n列可能放入皇后 chess = temp_chess;//递归回溯至此时,恢复当时棋盘数组 location[k][i] = '#';//将当前皇后位置重新置...#号,再次尝试 } } } //定义最终在main函数调用函数,NQueens,返回二维字符串数组 vector> NQueens(int n

42220

回溯——第51题. N皇后——必须攻克经典回溯难题

1 题目描述 按照国际象棋规则,皇后可以攻击与之处在同一行或同一列或同一斜线上棋子。 n 皇后问题 研究是如何将 n皇后放置在 n×n 棋盘上,并且使皇后彼此之间不能相互攻击。...给你一个整数 n ,返回所有不同 n 皇后问题 解决方案。 每一种解法包含一个不同 n 皇后问题 棋子放置方案,该方案 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。...基于上述发现,可以通过回溯方式寻找可能解。 回溯具体做法是:使用一个数组记录每行放置皇后列下标,依次在每一行放置一个皇后。...每次新放置皇后都不能和已经放置皇后之间有攻击:即新放置皇后不能和任何一个已经放置皇后在同一列以及同—条斜线上,并更新数组的当前行皇后列下标。当N皇后都放置完毕,则找到一个可能解。...因此使用行下标与列下标之和即可明确表示每一条方向二斜线。 每次放置皇后时,对于每个位置判断其是否在三个集合,如果三个集合都不包含当前位置,则当前位置是可以放置皇后位置。

82520

通过n皇后问题搞明白回溯算法

这次我们来聊聊n皇后问题。n 皇后问题,研究是如何将 n皇后放置在 n×n 棋盘上,并且使皇后彼此之间不能相互攻击。...这个高大上回溯是什么 针对n皇后问题我们把这个思路再展开一下: 把一个皇后放在第一行第一列 然后我们在第二行找到一个位置,在这儿第二个皇后不会被第一行皇后攻击到 如果我们找不到这样一个位置, 那我们就回退到前一行...继续发散 上面我们搜索过程,一行一行上升去寻找合适位置,然后在某个条件下又回到前一行,有点像栈入栈出栈操作,其实我们也是可以用栈来实现整个回溯过程。...我们在某一行里找到一个合适位置时就把它列push到栈回溯到前一行时再把它pop出来。...这边整个逻辑还是比较直接,我们依旧需要isValidPosition这个辅助方法来判断某个位置能不能放置皇后,然后对每个位置逐一判断,用栈来配合寻找过程回溯操作,核心思想还是不变

43860

回溯法求解八皇后问题

回溯基本做法是搜索,或是一种组织得井井有条,能避免不必要搜索穷举式搜索法。这种方法适用于解一些组合数相当大问题。 回溯法在问题解空间树,按深度优先策略,从根结点出发搜索解空间树。...算法解决思路是: 从棋盘第一行开始,从第一个位置开始,依次判断当前位置是否能够放置皇后,判断依据为:同该行之前所有行皇后所在位置进行比较,如果在同一列,或者在同一条斜线上(斜线有两条,为正方形两个对角线...下面是C++源代码,用回溯法求解N皇后问题: #include #include #include #include using...} } } //回溯法求解N皇后问题递归函数 void backtrack(int row, vector &queen, array<array<bool...//将结果queen存储到solve return; } //核心部分 for(int col =0; col< N; col++)//遍历各列,回溯试探皇后可放位置

1.1K10

从 DFS 到回溯法,再看 N 皇后问题

看一下wiki对回溯解释: 回溯法采用 试错 思想,它尝试分步去解决一个问题。...在分步解决问题过程,当它通过尝试发现,现有的分步答案不能得到有效正确解答时候,它将取消上一步甚至是上几步计算,再通过其它可能分步解答再次尝试寻找问题答案。...OK,以上是概念介绍,下面来一道经典之经典之经典回溯算法题:N皇后 n 皇后问题 研究是如何将 n 个皇后放置在 n×n 棋盘上,并且使皇后彼此之间不能相互攻击。...给你一个整数 n ,返回所有不同 n 皇后问题 解决方案。 每一种解法包含一个不同 n 皇后问题 棋子放置方案,该方案 'Q' 和 '.' 分别代表了皇后和空位。...示例 2: 输入: n = 1 输出: [["Q"]] N 皇后问题很多时候作为例题出现在教科书中,可以当做理解回溯算法例题进行学习; 以 4 皇后问题为例,递归树如下: 解题思路: 回溯算法通用解题思路就是在递归之前做选择

28310

N皇后 II----回溯篇8

N皇后||题解集合 回溯回溯法 本题就是leetcode 面试题 08.12....八皇后----回溯篇7,也就是我们回溯篇7讲过问题,只不过这里区别在于,第 51 题需要得到所有可能解,这道题只需要得到可能数量。...这里只演示使用回溯篇6第一种方式做法,详情可以去看回溯篇6 具体求解过程也不再啰嗦,详情去看回溯篇6 代码: class Solution { int sum = 0; vector...//如果当前n行i列能够放置皇后,那么就继续寻找下一个皇后合适放置位置 if (isValild(n)) backTrace(n + 1, N); //如果找到了一种解,或者当前状态无解...{ //第n行要放置皇后需要和前面n-1行已经放置皇后进行检查,看是否产生位置冲突 for (int i = 0; i < n; i++) { if (a[n] == a[i]

16040
领券