八皇后問題,一個古老而著名的問題,是回溯算法的典型案例。該問題由國際西洋棋棋手馬克斯·貝瑟爾於 1848 年提出:在 8×8 格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。高斯認爲有 76 種方案。1854 年在柏林的象棋雜誌上不同的作者發表了 40 種不同的解,後來有人用圖論的方法解出 92 種結果。計算機發明後,有多種計算機語言可以編程解決此問題。------from百度百科
public class Queen8 {
int count = 0; //記錄有幾種解法
int max = 8; //設定爲8x8的棋盤
int[] array = new int[max];
public static void main(String[] args) {
Queen8 q = new Queen8();
q.check(0);
System.out.println("total:" + q.count);
}
//主要計算函數,計算第n行放置情況
private void check(int n){
if(n == max){
print();
return;
}
//進行放置
for(int i=0; i<max; i++){
array[n] = i;
if(isOK(n)){
check(n+1); //繼續放下一行
} else {
continue; //嘗試新的位置
}
}
}
//判斷第n行的放置情況是否可行
private boolean isOK(int n){
for(int i=0; i<n; i++){
//如果列相同或者組成斜率爲1則不合法
if(array[n]==array[i] || Math.abs(n-i)==Math.abs(array[n]-array[i])){
return false;
}
}
return true;
}
//打印數組
private void print(){
count++; //解法數量加一
for(int i=0; i<max; i++){
System.out.print(array[i]);
if(i != max-1){
System.out.print(" ");
}
}
System.out.println();
}
}