N皇后(N<=20)在你弄懂其他皇后后是比较好理解的,你可以发现1`3皇后之间是没有解的,就是因为这几种情况不满足条件:1.同行同列不能有皇后(同行已经被抛弃了,以为我们已经知道每行就只有一个皇后)。2.左上角和右下角(正对角线)上不能有皇后存在。3.左上角和右上角(反对角线)上不能有皇后存在。所以我们要用一个数组标明 列、正对角线、反对角线 上的情况(并不是将对角线全部标记,而是标记一个来进行下面皇后的判断).
import java.util.*;
public class gfgjh {
private static int a[][] = new int[20][20];
private static int count = 0;
private static int add = 1;
private static int b[][] = new int[3][40];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
a[i][j] = 0;
}
}
for (int i = 0; i < b.length; i++) {
for (int j = 0; j < b[i].length; j++) {
b[i][j] = 0;
}
}
arr(0, num);
}
public static void arr(int k, int num) {
if (add > num) {
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
if (a[i][j] == 0) {
System.out.print("*");
} else {
System.out.print("Q");
}
}
System.out.println();
}
System.out.println("------------");
} else {
for (int i = 0; i < num; i++) {
if (b[0][i] == 0 && b[1][i + k] == 0 && b[2][k - i + num] == 0) {
// b[0][i] == 0判断同行是否存在皇后,b[1][i + k] == 0,判断右上角和左下角是否存在皇后,b[2][k - i + num] ==
// 0判断左上角和右小角是否有皇后存在。
{
a[k][i] = add;
add++;
b[0][i] = b[1][i + k] = b[2][k - i + num] = 1;
}
arr(k + 1, num);
{
a[k][i] = 0;
b[0][i] = b[1][i + k] = b[2][k - i + num] = 0;
add--;
}
}
}
}
}
}