八皇后问题(递归回溯法)--Java实现

一时失言乱红尘 2022-02-17 18:14 354阅读 0赞

一.题目

经典的八皇后问题是要将八个皇后放在棋盘上,任何两个皇后不能相互攻击(即没有两个皇后是在同一行,同一列或者同意对角线上).编写程序列出所有的解决方案和解决方案的总数.

二.代码及思想

  1. package work22;
  2. public class Test {
  3. public static int[][] array = new int[8][8]; //初始化棋盘
  4. public static int map; //八皇后可能解的个数
  5. public static void main(String[] args) {
  6. // TODO 自动生成的方法存根
  7. System.out.println("八皇后问题 : ");
  8. search(0);
  9. //System.out.println();
  10. System.out.println("八皇后一共有" + map + "个解");
  11. }
  12. public static void search(int i){
  13. if(i > 7){
  14. map++;
  15. print();
  16. return; //return后会接着指向array[i][j]=0,然后继续for循环,寻找下一个合适的解
  17. }
  18. for(int j = 0; j < 8; j++){
  19. if(check(i, j)){
  20. array[i][j] = 1;
  21. search(i+1);
  22. array[i][j] = 0; //清零,以免回溯的时候出现脏数据,当这一行都没有合适结点时被调用
  23. }
  24. }
  25. }
  26. public static boolean check(int i, int j){ //检查该结点是否符合条件
  27. for(int k = 0; k < i; k++){ //检查与该结点在一列上的元素是否有不为1的结点,且只检查在改结点上方的行,因为下方的行全为0,无需检查
  28. if(array[k][j] == 1){
  29. return false;
  30. }
  31. }
  32. for(int m = i-1, n = j-1; m>=0&& n>=0; m--, n--){ //检查左对角线上的元素
  33. if(array[m][n] == 1){
  34. return false;
  35. }
  36. }
  37. for(int m = i-1, n = j+1; m>=0&& n<=7; m--, n++){ //检查右对角线上的元素
  38. if(array[m][n] == 1){
  39. return false;
  40. }
  41. }
  42. return true;
  43. }
  44. public static void print(){ //打印符合条件结点的位置
  45. for(int i = 0; i < 8; i++){
  46. for(int j = 0; j < 8; j++){
  47. if(array[i][j] == 1){
  48. System.out.print("[" + i + " ," + j + "] ");
  49. }
  50. }
  51. }
  52. System.out.println();
  53. }
  54. }

核心代码是search方法,该方法有一个参数i表示当前判断到第几行,if(i > 7)这个判断表示已经找到了一种情况(即行数已经超过7),然后调用print方法打印该种情况,并通过return语句返回到上一次递归中的array[i][j] = 0,将这种情况下的最后一个值清为0,并在此基础上接着for循环寻找改行下一个可能的值,若没有,则接着向上回溯.

解决八皇后问题使用的是递归回溯算法.

发表评论

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

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

相关阅读

    相关 解决皇后回溯算法

    问题简述:八皇后问题是一个古来而著名的问题,该问题是19世纪著名的数学家高斯同学提出来的。在8\8的国际象棋上摆放八个皇后,使其不能互相的攻击,也就是说,任意的两个皇后不能放在

    相关 皇后问题回溯

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