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

(Java实现) N皇后问题

n皇后问题是一个以国际象棋为背景问题:在n×n国际象棋棋盘上放置n皇后,使得任何一个皇后都无法直接吃掉其他皇后,即任意两个皇后都不能处于同一条横行、纵行或斜线上。...具体实现中回溯法与蛮力法主要区别在于判断棋盘代码所在位置,蛮力法在摆放完所有皇后后再判断,回溯法在每摆放好一个皇后时就进行判断。...具体实现: ---- 根据n皇后问题规模,创建大小为n数组代替树结构,使其下标代表行数,内容代表列数,数组中每个数必定位于不同行,数组内容不同证明两个元素位于不同列,两数下标的差绝对值不等于两数内容绝对值...import java.util.Arrays; import java.util.Scanner; public class Nhuanghouwenti { private static int queenNum...row, int column) { //一行一个皇后,第n皇后也代表着第n行 if(row == 1){//第1行永远不会冲突 return false; } //只需要保证与那些已经就位皇后不冲突即可

83810
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    回溯法 n 皇后问题(Java实现

    n 皇后问题 问题分析 在n×n棋盘上放置彼此不受攻击n皇后。按照国际象棋规则,皇后可以攻击与之处在同一行或同一列或同一斜线上棋子。...n后问题等价于在n×n棋盘上放置n皇后,任何2个皇后不放在同一行或同一列或同一斜线上。...xi 表示皇后i 放在棋盘第i 行第xi 列 - 不能在同一行 - 不能在同一列 xi 互不相同 - 不能在同一斜线 - 斜率为1 和值相等 - 斜率为-1 差值相等 -...- i - j = k - l => i - k = j - l - i + j = k + l => i - k = l -j - 即 |i - k| = |j - l| 成立即可Java...{ /** 皇后个数 */ static int n; /** 当前解 */ static int[] x; /** 当钱已找到可行方案数 */ static long sum;

    69187

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

    大家好,又见面了,我是你们朋友全栈君。 问题描述: 要求在一个n×n棋盘上放置n皇后,使得它们彼此不受攻击。...按照国际象棋规则,一个皇后可以攻击与之同一行或同一列或同一斜线上任何棋子。 因此,n皇后问题等价于:要求在一个n×n棋盘上放置n皇后,使得任意两个皇后不在同一行或同一列或同一斜线上。...一个皇后攻击范围: n皇后解空间—完全n叉树: 要找出“四皇后”问题解,最可靠方法就是把各种情况都分析一遍,将符合条件解找出来。但这样做十分地费时间。...N皇后都存在于链表中,才算得到了一个解: /** * 判断位置为loc皇后是否合法 */ private static boolean isLegalLoc(LinkedList...全部代码(其中还包括将N皇后问题解显示输出函数): package quene; import java.util.LinkedList; import java.util.Scanner; public

    74640

    n皇后问题java

    n皇后问题是一个典型回溯算法题目,就是在n*n面板上,放n皇后,每个皇后会攻击同一列和同一行还有两个斜边上元素,问你放方法,返回形式是一个List嵌套List,每个List里都是一种解决方案...,每一个解决方案都是画一个面板,解决方案里每一个元素都是每一个横行,如果没有放皇后,则以.来形容,如果放了皇后,以Q填充,在思想上肯定还是有一定难度,先贴上java代码实现,这里已经优化了很多,因为我们是一行一行来放...,不存在有没有Q存在,所以只需要判断现在棋盘面板上上方、左上方、右上方是否有Q存在(isVaild实现)即可,这样看起来通俗易懂,当然这个思想是用了回溯算法,在每一个循环里面,先实施放Q操作,...{ char[][] borad = new char[n][n];//设置一个n*n正方形char型数组 for(char[] rchar: borad){//遍历二维数组每一行...void sovleQuestion(char[][] borad,int row){ int n = borad.length;//判断一下这个是几个皇后问题,也就是棋盘宽度 if

    72110

    N皇后

    说明: N皇后问题是一个以国际象棋为背景问题:如何能够在N×N国际象棋棋盘上放置N皇后,使得任何一个皇后都无法直接吃掉其他皇后。...为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。 解法: N皇后中任意两个不能处在同一行,所以每个皇后必须占据一行,及一列。我们采用回溯法思想去解。...总结一下,用回溯法解决N皇后问题步骤: (1)从第0列开始,为皇后找到安全位置,然后跳到下一列. (2)如果在第n列出现死胡同,如果该列为第0列,棋局失败,否则后退到上一列,再进行回溯....i++)//枚举N列  { for(j = 0;j < k;j++)//前k行皇后  {//第j行皇后列是queen[j],不能和我当前列相同  if(queen[j] == i... 0; } Java: public class Nqueen{      static int[] queen = new int[100];      static int N,sum = 0;

    73320

    N皇后

    N皇后 力扣题目链接:https://leetcode-cn.com/problems/n-queens n 皇后问题 研究是如何将 n皇后放置在 n×n 棋盘上,并且使皇后彼此之间不能相互攻击...给你一个整数 n ,返回所有不同 n 皇后问题 解决方案。 每一种解法包含一个不同 n 皇后问题 棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。...首先来看一下皇后约束条件: 不能同行 不能同列 不能同斜线 确定完约束条件,来看看究竟要怎么去搜索皇后位置,其实搜索皇后位置,可以抽象为一棵树。...下面我用一个3 * 3 棋牌,将搜索过程抽象为一颗树,如图: 51.N皇后 从图中,可以看出,二维矩阵中矩阵高就是这颗树高度,矩阵宽就是树形结构中每一个节点宽度。...backtracking(board, 0, n) return res Java class Solution { List> res = new

    76510

    n皇后问题总结_模拟退火n皇后

    大家好,又见面了,我是你们朋友全栈君。 N皇后问题是一个经典问题,在一个N*N棋盘上放置N皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上皇后都会自动攻击)。...上网查看了别人实现之后大吃一惊,大牛们都是使用一个一维数组来存储棋盘,在某个位置上是否有皇后可以相互攻击判断也很简单。...上面说过该问题是回溯法经典应用,所以可以使用回溯法来解决该问题,具体实现也有两个途径,递归和非递归。...但是一般来说递归效率比较差,下面重点讨论一下该问题非递归实现。 非递归方法一个重要问题时何时回溯及如何回溯问题。...完整代码如下: [cpp] view plain copy /* ** 目前最快N皇后递归解决方法 ** N Queens Problem ** 试探-回溯算法,递归实现

    83330

    N-QueensN-Queens IIN皇后N皇后 II

    N-Queens 题目大意 经典皇后问题一般情况 注意点: 皇后用”Q”表示,空白用”.”表示 解题思路 回溯法,位运算等,见总结 代码 回溯法 使用一位数组存储可能解法例如[1,3,0,2...def make_string_list(self, columns): sol = [] # 一个完整棋盘 row = ['.' for i in range(self.n...于是当前行所有不合法位置即为 row | ld | rd ,整体上加快了寻找合法位置速度。 考虑问题对称性 将8皇后其中一个解垂直翻转后,可以得到一个新解,故,可以只计算一半,从而加快时间。...N-Queens II 题目大意 计算解个数 解题思路 不需要画图,有一个解就自增1 代码 class Solution(object): def totalNQueens(self, n):...看到用位计算,以后学习参考,效率两道题目都是最高

    88010

    n皇后 回溯

    我个人理解就是不断地去尝试,满足条件便一直深入下去尝试,直到出现不满足情况时或则得到答案时便返回上一层 n皇后 n皇后问题就是在n*n棋盘上放置n皇后,使得n皇后两两之间不能进行攻击(即每两个皇后不可以在同一行...,同一列,在同一斜线上(斜率为1斜线)) 问题解析 n皇后问题就是依次将每个皇后放在棋盘某个位置,每次放置时要判断这个位置是否可以放置皇后,判断方式就是对已放置皇后坐标进行对比并且验证将要放置皇后是否满足互不攻击条件...==n) //说明前n-1行都放置了皇后,就确定了一个方案 { all++; } else{ for(int i=0;i<n;i++)...]=i; getResult(row+1); } } } } 大致思想就是一行一行进行放置皇后,这样可以保证每个皇后都不在同一个行,...这样在判断放置位置是否合理时,只需判断是否与已放置皇后是否在一列或者在一斜线。

    17410

    N 皇后问题_用回溯法解N皇后问题

    大家好,又见面了,我是你们朋友全栈君。 n 皇后问题研究是如何将 n皇后放置在 n×n 棋盘上,并且使皇后彼此之间不能相互攻击。...给定一个整数 n,返回所有不同 n 皇后问题解决方案。 每一种解法包含一个明确 n 皇后问题棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。...", "...Q", ".Q.."] ] 解释: 4 皇后问题存在两个不同解法。...false 代表 左上 到 下右 对角线没有皇后, 这条对角线所有元素横纵坐标差相同 public List> solveNQueens(int n) { if(n row = new LinkedList(); putQueue(n, 0, row); return res; } // 尝试在一个n皇后问题中,摆放第index行皇后位置

    40620

    n皇后问题c语言代码_求n阶乘java代码

    大家好,又见面了,我是你们朋友全栈君。 问题描述: 有一个n*n棋盘,在这个棋盘中放n皇后,使得这n皇后,任意两个皇后不在同一行,同一列,同一条对角线。...思路 如果我们是从这个n*n棋盘中选取n个方格放皇后,再去判断是否满足条件的话,则效率会非常低,这是一个组合数 ∁ \complement ∁ n nn n \atop n*n n∗nn​,当n...等于8时,就要枚举54502232次 方法一:递归暴力法 做这个题之前,我们回想一下字符串全排列,这个和它相似,可以枚举每一行列数,枚举完一个棋盘后,判断任意两个皇后是否在同一条线上,例如上面的摆法1...(2413).这个方法复杂度为n!...这个题是当我们递归时候就去判断当前皇后是否和前面的皇后在一条对角线上,如果在一条直线上,就不需要递归下去了,返回上一层;如果不在,就继续递归,下一个继续进行判断,直到满足条件为止。

    1.6K20

    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;

    27430

    N皇后

    n 皇后问题研究是如何将 n皇后放置在 n×n 棋盘上,并且使皇后彼此之间不能相互攻击。 上图为 8 皇后问题一种解法。 给定一个整数 n,返回所有不同 n 皇后问题解决方案。...每一种解法包含一个明确 n 皇后问题棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。 示例: 输入: 4 输出: [ [".Q.....解:任意两个皇后都不在同一条横线、竖线、斜线方向上,有难度,主要是理解以下三个数组表示是什么意思,其实组成n*nn皇后矩阵可以看成一个数学坐标系,我们知道y=k*x+b表示是一条直线,k为斜率,...//cross2[i]表示第i条左上-右下方向斜线是否已经存在皇后 boolean[] column = new boolean[n]; boolean...(int j = 0; j < n; j++) { // 判断是否会和之前放置皇后产生列上冲突y=x if (column[j])

    30810
    领券