回溯法-N皇后问题

- 日理万妓 2022-11-17 05:08 330阅读 0赞

一、N皇后问题

n皇后问题:要求在一个n×n的棋盘上放置n个皇后,使得任意两个皇后不在同一行或同一列或同一斜线上。

二、回溯法

回溯法是一类非常重要的算法设计方法,有“通用解题法”之称。

回溯法(探索与回溯法):一种选优搜索法,又称试探法。利用试探性的方法,在包含问题所有解的解空间树中,将可能的结果搜索一遍,从而获得满足条件的解。搜索过程采用深度遍历策略,并随时判定结点是否满足条件要求,满足要求就继续向下搜索,若不满足要求则回溯到上一层,这种解决问题的方法称为回溯法。

回溯法解求解问题步骤

  • 针对给定问题,定义问题的解空间树
  • 确定易于搜索的解空间结构
  • 以深度优先方式搜索解空间,并且在搜索过程中永剪枝函数避免无效搜索。

下面给出一个三皇后问题的解空间树(3皇后问题无解),树中第i层的结点决定第i行皇后的摆放位置,均有三种不同的选择,便形成了三个孩子结点,但其中不包括不符合要求的布局。N皇后问题解空间树与三皇后问题解空间树类似。
在这里插入图片描述

N皇后Java程序算法

  1. public class nQueen {
  2. private static int n = 4;
  3. private static int count = 0;//排法结果
  4. private static int[] arrResult = new int[n];
  5. public static void main(String[] args) {
  6. //从第一行开始向下查找
  7. search(0);
  8. System.out.println("结果数量:" + count);
  9. }
  10. //第i行,总的n行n列
  11. public static void search(int i) {
  12. if (i >= n) {
  13. //一组查找结束
  14. count++;
  15. System.out.println("结果"+Arrays.toString(arrResult));
  16. } else {
  17. //遍历所有列
  18. for (int j = 0; j < n; j++) {
  19. //将该列放置queen
  20. arrResult[i] = j;
  21. //如果将行的每一列都找不到存放点,则进行回朔查找。
  22. if (isCanPlace(arrResult, i, j)) {
  23. //可存放,继续下一行
  24. search(i + 1);
  25. }
  26. }
  27. }
  28. }
  29. //是否可放置,false为不可放置,true为可放置
  30. public static boolean isCanPlace(int arr[], int i, int j) {
  31. //遍历所有行数
  32. for (int k = 0; k < i; k++) {
  33. //行存在
  34. if (arr[k] == arr[i]) {
  35. return false;
  36. }
  37. //对角线存在
  38. if ((Math.abs(k - i)) == Math.abs(arr[k] - arr[i])) {
  39. return false;
  40. }
  41. }
  42. return true;
  43. }
  44. }

解析:

  1. 结果集arrResult[4]=[0,0,0,0]
  2. arr[] i 0 1 2 2(第二次) 3
  3. 0 arrResult[]=[0,0,0,0] arrResult[]=[0,0,0,0] 不满足,继续下一列 arrResult[]=[0,2,0,0] 不满足,继续下一列 arrResult[]=[0,3,0,0] 不满足,继续下一列
  4. 1 可以放置,进入下一行 arrResult[]=[0,1,0,0] 不满足,继续下一列 arrResult[]=[0,2,1,0] 不满足,继续下一列 arrResult[]=[0,3,1,0] 满足
  5. 2 arrResult[]=[0,2,0,0] 满足,下一行 arrResult[]=[0,2,2,0] 不满足,继续下一列
  6. 3 arrResult[]=[0,3,3,0] =>返回到这行,满足 arrResult[]=[0,2,3,0] 不满足,返回上一行进行查找

结果:

  1. 结果[1, 3, 0, 2]
  2. 结果[2, 0, 3, 1]
  3. 结果数量:2

发表评论

表情:
评论列表 (有 0 条评论,330人围观)

还没有评论,来说两句吧...

相关阅读

    相关 回溯-N皇后问题

    一、N皇后问题 n皇后问题:要求在一个n×n的棋盘上放置n个皇后,使得任意两个皇后不在同一行或同一列或同一斜线上。 二、回溯法 回溯法是一类非常重要的算法设计方法

    相关 皇后问题回溯

    问题描述 ![70][] 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上(与水平行轴成45°或135°),问有多少

    相关 回溯——八 / N 皇后问题

    回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。这种方法适用于解一些组合数相当大的问题。 回溯法在问题的解空间树中,按深度优先策略,从根结点