问题描述
在棋盘上放置n个皇后,使得她们互不攻击,此时每个皇后的攻击范围为同行同列和同对角线,要求找出所有解。
输入
8
输出
92
代码一
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
static int n, result = 0;
static ArrayList<Integer> arrayList = new ArrayList<Integer>();
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
n = in.nextInt();
search(0);
System.out.println(result);
}
in.close();
}
public static void search(int row) {
// 递归边界,到达这一步则说明皇后都不冲突
if (row == n) {
result++;
} else {
for (int i = 0; i < n; i++) {// n列
boolean flag = true;
// 把第row行的皇后放在第i列
// 当第row行没有元素时,增加,有则替换
if (arrayList.size() <= row) {
arrayList.add(new Integer(i));
} else {
arrayList.set(row, new Integer(i));
}
// 检查是否和前面的皇后冲突
// 因为是一行一行放的的,所以行不冲突
// 所以只需要检查列和对角线
// 格子(x,y)的y-x标识主对角线,x+y标识副对角线
for (int j = 0; j < row; j++) {
if (arrayList.get(j).intValue() == arrayList.get(row).intValue()
|| row + arrayList.get(row).intValue() == j + arrayList.get(j).intValue()
|| arrayList.get(j).intValue() - j == arrayList.get(row).intValue() - row) {
flag = false;
break;
}
}
// 不冲突则继续递归
if (flag) {
search(row + 1);
}
}
}
}
}
代码二
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
static int n, result = 0;
static ArrayList<Integer> arrayList = new ArrayList<Integer>();
static boolean[][] flag;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
n = in.nextInt();
flag = new boolean[3][2*n];
search(0);
System.out.println(result);
}
in.close();
}
public static void search(int row) {
// 递归边界,到达这一步则说明皇后都不冲突
if (row == n) {
result++;
} else {
for (int i = 0; i < n; i++) {// n列
// 把第row行的皇后放在第i列
// 当第row行没有元素时,增加,有则替换
// 检查是否和前面的皇后冲突
// 因为是一行一行放的的,所以行不冲突
// 所以只需要检查列和对角线
// 格子(x,y)的y-x标识主对角线,x+y标识副对角线
// 使用二维数组判断
if (!flag[0][i] && !flag[1][row + i] && !flag[2][row - i + n]) {
if (arrayList.size() <= row) {
arrayList.add(new Integer(i));
} else {
arrayList.set(row, new Integer(i));
}
flag[0][i] = flag[1][row + i] = flag[2][row - i + n] = true; // 修改全局变量
search(row + 1);
flag[0][i] = flag[1][row + i] = flag[2][row - i + n] = false; // 恢复全局变量
}
}
}
}
}