算法:eight Queens 8皇后问题

说明

国际象棋的规则,皇后可以横着走,竖着走,对角线走.
这个是回溯算法的经典问题。

规则如下:

  1. 每行必须有一个皇后
  2. 每列,对角线最多只能有一个皇后。
  3. 求出所有的可行解。

下面左图为一种可行解,右图为一种不可行解。
在这里插入图片描述

算法实现

package backtracking;

public class EightQueens {

  public static void main(String[] args) {
    EightQueens obj = new EightQueens();
    obj.cal8queens(0);
  }

  int count = 0;
  int[] result = new int[8];//全局或成员变量,下标表示行,值表示queen存储在哪一列
  public void cal8queens(int row) { // 调用方式:cal8queens(0);
    if (row == 8) { // 8个棋子都放置好了,打印结果
      printQueens(result);
      return; // 8行棋子都放好了,已经没法再往下递归了,所以就return
    }
    for (int column = 0; column < 8; ++column) { // 每一行都有8中放法
      if (isOk(row, column)) { // 有些放法不满足要求
        result[row] = column; // 第row行的棋子放到了column列
        cal8queens(row+1); // 考察下一行
      }
    }
  }

  private boolean isOk(int row, int column) {//判断row行column列放置是否合适
    int leftup = column - 1, rightup = column + 1;
    for (int i = row-1; i >= 0; --i) { // 逐行往上考察每一行
      if (result[i] == column) return false; // 第i行的column列有棋子吗?
      if (leftup >= 0) { // 考察左上对角线:第i行leftup列有棋子吗?
        if (result[i] == leftup) return false;
      }
      if (rightup < 8) { // 考察右上对角线:第i行rightup列有棋子吗?
        if (result[i] == rightup) return false;
      }
      --leftup; ++rightup;
    }
    return true;
  }

  private void printQueens(int[] result) { // 打印出一个二维矩阵
    System.out.println(">>>>>> solution  " + (++count) + "  <<<<<<<<");
    for (int row = 0; row < 8; ++row) {
      for (int column = 0; column < 8; ++column) {
        if (result[row] == column) System.out.print("Q ");
        else System.out.print("* ");
      }
      System.out.println();
    }
    System.out.println();
  }
}


结果输出:

>>>>>> solution  1  <<<<<<<<
Q * * * * * * * 
* * * * Q * * * 
* * * * * * * Q 
* * * * * Q * * 
* * Q * * * * * 
* * * * * * Q * 
* Q * * * * * * 
* * * Q * * * * 

>>>>>> solution  2  <<<<<<<<
Q * * * * * * * 
* * * * * Q * * 
* * * * * * * Q 
* * Q * * * * * 
* * * * * * Q * 
* * * Q * * * * 
* Q * * * * * * 
* * * * Q * * * 


...


>>>>>> solution  92  <<<<<<<<
* * * * * * * Q 
* * * Q * * * * 
Q * * * * * * * 
* * Q * * * * * 
* * * * * Q * * 
* Q * * * * * * 
* * * * * * Q * 
* * * * Q * * * 


发布了127 篇原创文章 · 获赞 12 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/zgpeace/article/details/103453978