package com.kingdz.algorithm.time201704;
/**
* 八皇后问题,递归法
*
* @author kingdz
*
*/
public class Algo26 {
static int MAX_QUEUE = 8;
// 记录解法的次数
static int time = 1;
public static void main(String[] args) {
int[] queens = new int[MAX_QUEUE];
queen(0, queens);
}
/**
* 处理第n个皇后的位置
*
* @param n
* @param queens
*/
private static void queen(int n, int[] queens) {
if (n == MAX_QUEUE) {
output(queens);
// 重置棋盘
queens = new int[MAX_QUEUE];
return;
}
for (int i = 0; i < MAX_QUEUE; i++) {
// 为第n个皇后赋值
queens[n] = i + 1;
if (isValid(n, queens)) {
// 如果第n个皇后的位置合法,则为第n+1个皇后赋值
queen(n + 1, queens);
if (n + 1 < MAX_QUEUE) {
queens[n + 1] = 0;
}
}
}
}
/**
* 判断第n个皇后的位置是否合法
*
* @param n
* @param queens
* @return
*/
static boolean isValid(int n, int[] queens) {
for (int i = 0; i < MAX_QUEUE; i++) {
// 忽略其本身和本身之间的判断
if (queens[i] == 0 || i == n) {
continue;
}
// 如果有皇后和目标皇后同一行
if (queens[i] == queens[n]) {
return false;
}
// 如果有皇后和目标皇后在同一斜行
if (Math.abs(queens[i] - queens[n]) == Math.abs(n - i)) {
return false;
}
}
return true;
}
/**
* 八皇后的输出
*
* @param queens
*/
static void output(int[] queens) {
System.out.println("第" + time + "种解法");
time++;
for (int i = 0; i < MAX_QUEUE; i++) {
for (int j = 0; j < MAX_QUEUE; j++) {
if (queens[j] == i + 1) {
System.out.print("*");
} else {
System.out.print("O");
}
}
System.out.println();
}
System.out.println("-----------------------------");
}
}