本文旨在在於記錄一個百度上看來的算法,算法讓我喫驚的地方在於將數組下標的功能發揮的淋漓盡致。八皇后問題常規算法矩陣維護法、遞歸法、迭代法、手動堆棧法四種。但是本質都是在描述同一行、同一列或同一斜線上(右上到左下,左上到右下)四種關係。在百度上看到的一種算法private
int[] rup =
new
int
[(
2
*
8
)+
1]; //右上至左下是否有皇后和private
int[] lup =
new
int
[(
2
*
8
)+
1
]; //左上至右下是否有皇后僅用兩個一維數組就完美的展現出了這種關係。看過後只能感嘆自己以前學習不夠努力了啊。
具體算法:
public class Queen {
private int[] column; //同欄是否有皇后,1表示有
private int[] rup; //右上至左下是否有皇后
private int[] lup; //左上至右下是否有皇后
private int[] queen; //解答
private int num; //解答編號
public Queen() {
column = new int[8+1];
rup = new int[(2*8)+1];
lup = new int[(2*8)+1];
for (int i = 1; i <= 8; i++)
column[i] = 0;
for (int i = 1; i <= (2*8); i++)
rup[i] = lup[i] = 0; //初始定義全部無皇后
queen = new int[8+1];
}
public void backtrack(int i) {
if (i > 8) {
showAnswer();
} else {
for (int j = 1; j <= 8; j++) {
if ((column[j] == 0) && (rup[i+j] == 0) && (lup[i-j+8] == 0)) {
//若無皇后
queen[i] = j; //設定爲佔用
column[j] = rup[i+j] = lup[i-j+8] = 1;
backtrack(i+1); //循環調用
column[j] = rup[i+j] = lup[i-j+8] = 0;
}
}
}
}
protected void showAnswer() {
num++;
System.out.println("\n解答" + num);
for (int y = 1; y <= 8; y++) {
for (int x = 1; x <= 8; x++) {
if(queen[y]==x) {
System.out.print("Q");
} else {
System.out.print(".");
}
}
System.out.println();
}
}
public static void main(String[] args) {
Queen queen = new Queen();
queen.backtrack(1);
}
}
總結:算法是常規的回溯,主要是一維數組表示斜線關係,很是巧妙。