n皇后問題
問題描述
N皇后問題,在一個NN的棋盤上放置N個皇后,使其不能互相攻擊(同一行、同一列、同一斜線上的皇后都會自動攻擊),即任意兩個皇后不得處於同一行、同一列、同意斜線上。
問題分析
我們可以定義一個數組Column[N]來存放每一行皇后的列號,數組中第i個數字就表示位於第i行的皇后的列號;並將0、1、2、3、4…N-1分別放入數組中放入時候判斷是否在同一列,以及是否爲一條斜線。
public class Code028_03 {
public static void main(String[] args) {
//鍵盤接收一個參數輸入,表示N
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int result = totalNQueens(N);
System.out.println(result);
}
//定義一個靜態變量,用來記錄(存儲)滿足情況的排列數
static int sum = 0;
private static int totalNQueens(int n) {
if (n <= 0) {
return 0;
}
int[] data = new int[n];
sum = QueenCore(0, n, data, sum);
return sum;
}
private static int QueenCore(int index, int n, int[] data, int sum) {
if (index >= n) {
sum+=1;
// System.out.println(sum);
for (int i = 0; i < n; i++) {
System.out.print(data[i] + ", ");
}
System.out.println();
} else {
for (int i = 0; i < n; i++) {
data[index] = i;
if (Diagonal(data, index)) {
sum=QueenCore(index + 1, n, data, sum);
}
}
}
return sum;
}
private static boolean Diagonal(int[] data, int index) {
for (int i = 0; i < index; i++) {
//判斷任意兩個皇后是否在同一斜線,是否在同一列;滿足在同一斜線:兩元素的列之差的絕對值等於行之差的絕對值
if (Math.abs(data[i] - data[index]) == Math.abs(i - index) || data[i] == data[index]) {
return false;
}
}
return true;
}
}