【經典題目】八皇后問題
題目:在2*2的國際象棋上擺放着8個皇后,使其不能相互攻擊,即任意兩個皇后不得處在同一行、同一列或者同一個對角線上。下圖所示:圖中有八個皇后,這就是一種符合條件的擺放方法。請問共有多少種符合條件的擺法?
下面是採用遞歸方法來實現的八皇后問題
//8 Queen 遞歸算法
//如果有一個Q 爲 chess[i]=j;
//則不安全的地方是 k行 j位置,j+k-i位置,j-k+i位置
class Queen8 {
static final int QueenMax = 8;
static int oktimes = 0;
static int chess[] = new int[QueenMax];// 每一個Queen的放置位置
public static void main(String[] args) {
long time = System.currentTimeMillis();
for (int i = 0; i < QueenMax; i++)
chess[i] = -1;
placequeen(0);
System.out.println("\n\n\n八皇后共有" + oktimes + "個解法 made by yifi 2003");
System.out.println((System.currentTimeMillis() - time) + "毫秒");
}
public static void placequeen(int num) { // num 爲現在要放置的行數
int i = 0;
boolean qsave[] = new boolean[QueenMax];
for (; i < QueenMax; i++)
qsave[i] = true;
// 下面先把安全位數組完成
i = 0;// i 是現在要檢查的數組值
while (i < num) {
qsave[chess[i]] = false;
int k = num - i;
if ((chess[i] + k >= 0) && (chess[i] + k < QueenMax))
qsave[chess[i] + k] = false;
if ((chess[i] - k >= 0) && (chess[i] - k < QueenMax))
qsave[chess[i] - k] = false;
i++;
}
// 下面歷遍安全位
for (i = 0; i < QueenMax; i++) {
if (qsave[i] == false)
continue;
if (num < QueenMax - 1) {
chess[num] = i;
placequeen(num + 1);
} else { // num is last one
chess[num] = i;
oktimes++;
System.out.println("這是第" + oktimes + "個解法 如下:");
System.out.println("第n行: 1 2 3 4 5 6 7 8");
for (i = 0; i < QueenMax; i++) {
String row = "第" + (i + 1) + "行: ";
if (chess[i] == 0)
;
else
for (int j = 0; j < chess[i]; j++)
row += "--";
row += "++";
int j = chess[i];
while (j < QueenMax - 1) {
row += "--";
j++;
}
System.out.println(row);
}
}
}
// 歷遍完成就停止
}
}