import java.util.*;
public class Queen {
private static final int INITIAl = -1000;
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int[]a=new int[scanner.nextInt()];
init(a);
queen(a);
}
private static void init(int[] a) {
for (int i = 0; i < a.length; i++) {
a[i] = INITIAl;
}
}
private static boolean isValid(int row, int col, int[] a) {
for (int i = 0; i < a.length; i++) {
if (a[i] == col || Math.abs(i - row) == Math.abs(a[i] - col)) {
return false;
}
}
return true;
}
private static void print(int[] a) {
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length; j++) {
if (a[i] != j)
System.out.print(".");
else
System.out.print("Q");
}
System.out.println();
}
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]);
}
System.out.println();
System.out.println("--------------------------");
}
public static void queen(int[] a) {
int n = 0;
int i = 0, j = 0;
while (i < a.length) {
while (j < a.length) {
if (isValid(i, j, a)) {
a[i] = j;
j = 0;
break;
} else {
j++;
}
}
if (a[i] == INITIAl) { // 第i行没有找到放置皇后的位置
if (i == 0) // 回溯到第一行,仍然无法找到可以放置皇后的位置,则说明已经找到所有的解,程序终止
break;
else {
i--;
j = a[i] + 1; // 上一行皇后的位置向后移一列
a[i] = INITIAl; // 上一行皇后的位置清除
continue;
}
}
if (i == (a.length - 1)) { // 最后一行找到皇后位置,说明找到一个解
System.out.println("answer " + (++n));
print(a);
j = a[i] + 1;
a[i] = INITIAl;
continue;
}
i++;
}
}
}
八皇后问题
最新推荐文章于 2021-10-30 16:05:18 发布