对皇后问题给出一种解决方案. 算法是《算法分析与设计分析》教材上的. 要列举所有方案,还需自己改进!
package data_structure;
public class EightQueens {
private static final int NumberOfQueen = 8;
private static int [] queens = new int[NumberOfQueen + 1];
public static void main(String[] args) {
getQueenLoaction();
printQueens();
}
// 打印计算结果.
private static void printQueens() {
for (int i=1; i<queens.length; ++i) {
System.out.print(queens[i] + " ");
}
System.out.println();
}
// 计算皇后的位置.
private static void getQueenLoaction() {
int k = 1;
queens[1] = 0;
while (k > 0) {
queens[k] += 1;
while ((queens[k] <= NumberOfQueen) && (!isQueenKOk(k)))
queens[k] += 1;
if (queens[k] <= NumberOfQueen) {
if (k == NumberOfQueen) break;
else {
k += 1;
queens[k] = 0;
}
}
else {
queens[k] = 0;
k -= 1;
}
}
}
// 判断第 k 个皇后的位置(列标)是否 Ok.
private static boolean isQueenKOk(int k) {
for (int i=1; i<k; ++i) {
// 如果发现 第 k 个皇后的列标与前面的第 i 个皇后的列表相同; 或者与第 i 个的斜率是 +1 或 -1, 那么返回false, 表示第 k 个元素的位置不Ok.
// 否则, 第 k 个皇后的位置 Ok.
if ((queens[i] == queens[k]) || (Math.abs(queens[i]-queens[k]) == Math.abs(i - k)))
return false;
}
return true;
}
}