import java.util.LinkedList;
public class EightQueen {
private static boolean isCorrectColumn(int col, int curRow, int queenCount, int[] path) {
boolean bCorrect = true;
int leftup = col - 1;
int rightup = col + 1;
for (int i = curRow - 1; i >= 0; --i) {
if (path[i] == col) {
bCorrect = false;
break;
}
if (leftup >= 0 && path[i] == leftup) {
bCorrect = false;
break;
}
if (rightup < queenCount && path[i] == rightup) {
bCorrect = false;
break;
}
--leftup;
++rightup;
}
return bCorrect;
}
public static void findQueenPos(int queenCount, int curRow, int[] path, LinkedList<int[]> solutions) {
if (queenCount == curRow) {
solutions.add((int[])path.clone());
return;
}
for (int i = 0; i < queenCount; ++i) {
if (isCorrectColumn(i, curRow, queenCount, path)) {
path[curRow] = i;
findQueenPos(queenCount, curRow + 1, path, solutions);
}
}
}
public static LinkedList<int[]> solveQueenProblem(int queenCount) {
LinkedList<int[]> solutions = new LinkedList<int[]>();
int[] path = new int[queenCount];
findQueenPos(queenCount, 0, path, solutions);
return solutions;
}
public static void printQueenSolutions(int queenCount, LinkedList<int[]> solutions) {
System.out.println("皇后问题有" + solutions.size() + "种解决方案:");
for (int[] solution:solutions) {
for (int i = 0; i < solution.length; ++i) {
for (int j = 0; j < queenCount; ++j) {
if (j == solution[i]) {
System.out.print('O');
}
else {
System.out.print('X');
}
}
System.out.println();
}
System.out.println();
System.out.println();
}
}
public static void test() {
LinkedList<int[]> solutions = solveQueenProblem(8);
printQueenSolutions(8, solutions);
}
public static void main(String[] args){
test();
}
}