【算法】八皇后Java實現

八皇后算法描述以下:
在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法!
image.pngjava

下面來分析一波,假設此時咱們想要在黑色方塊位置放置一個皇后:
image.png算法

若是一列一列的放置皇后的話,圖中黑色位置能放置一個皇后的合法性條件爲:
一、綠色線條通過的方格沒有皇后 (不處於同一斜線)
二、紅色線條通過的方格沒有皇后 (不處於同一行)
三、紫色線條通過的方格沒有皇后 (不處於同一斜線)函數

也就是說若是以黑色方塊位置爲參照原點:(0,0)座標點,紫色和綠色兩個線條分別是斜率爲1和-1的兩個函數,以下圖:
紫色線所表明的函數是:y = -x;
綠色先所表明的函數是:y=x;
(橫座標是列,縱座標爲行,注意行從上到下遞增)
image.pngspa

凡是位於這兩條函數線上的位置(點)以及橫座標(說明位於同一行)都不能有皇后。也即行和列的差值要相等,如圖所示
image.png
Java代碼實現:.net

public class EightQueenMain {

  private static int[] queen = new int[]{-1, -1, -1, -1, -1, -1, -1, -1};
  private static int count = 0;

  public static void main(String[] args) {
    eightQueue(0);
    System.out.println(count);
  }

  private static boolean isLegal(int currentRow, int currentCol) {
    for (int col = 0; col < currentCol; col++) {
      if (currentRow == queen[col]) { // 只判斷行相等,由於是按列放皇后的
        return false;
      }
      if (Math.abs(queen[col] - currentRow) == Math.abs(col - currentCol)) { // 在斜線上(行列差值相等)
        return false;
      }
    }
    return true;
  }

  private static void eightQueue(int currentCol) {
    for (int row = 0; row < 8; row++) {
      if (isLegal(row, currentCol)) {
        queen[currentCol] = row;
        if (currentCol == 7) { // 到達最後一列得到正確結果
          count++;
        }
        eightQueue(currentCol + 1);
      }
    }

  }
}
輸出92

參考連接:八皇后回溯算法原理剖析及其JS實現code

相關文章
相關標籤/搜索