需求

image.png


思路分析

image.png


代码实现

  1. package com.h.递归.八皇后回溯;
  2. import java.util.ArrayList;
  3. public class Test {
  4. //存放所有结果
  5. public static ArrayList<Integer[]> checkerBoards = new ArrayList<>();
  6. //棋盘
  7. static int[] array = new int[8];
  8. //打印棋盘
  9. private static void soutCheckerboard(int[] checkerboard){
  10. for (int i : checkerboard) {
  11. System.out.print(i+" ");
  12. }
  13. System.out.println("");
  14. }
  15. //检测是否跟前面摆放的皇后冲突
  16. public static boolean isConflict(int n){
  17. for (int i = 0; i < n; i++) {
  18. //如果他们在同一列 , 或者在同一斜线 就返回 false
  19. if(array[i] == array[n] || Math.abs(n-i) == Math.abs(array[n] - array[i])){
  20. return false;
  21. }
  22. }
  23. return true;
  24. }
  25. //运行
  26. public static void run(int n){
  27. //放完退出
  28. if (n == 8){
  29. soutCheckerboard(array);
  30. return;
  31. }
  32. for (int i = 0; i < 8; i++) {
  33. array[n] = i;
  34. /*
  35. 判断是否与上一个皇后冲突
  36. 不冲突: 开始放置下一个皇后
  37. 冲突: 继续for循环 , 将皇后放置下一个位置
  38. */
  39. if (isConflict(n)) {
  40. run(n+1);
  41. }
  42. }
  43. };
  44. public static void main(String[] args) {
  45. Test test = new Test();
  46. test.run(0);
  47. }
  48. }