问题描述:
在N*N格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等于在N*N格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。
本题目解答思路:N后问题,所采用回溯法,递归函数BackTrack(1)实现对整个姐空间的回溯搜索,BackTrack搜索空间的第i层子树。类Queen的数据成员记录姐空间中结点信息,以减少传给BackTrack的参数,sum记录当前已找到的可行方案数。
源代码如下:
import java.util.Scanner;
public class Queen {
static int n;// 皇后个数
static long sum;// 当前解个数;
static int[] x;
public static void BackTrack(int t) {
if (t > n) {
sum++;
} else {
for (int i = 1; i <= n; i++) {
x[t] = i;
if (Place(t))
BackTrack(t + 1);
}
}
}
public static boolean Place(int k) {
for (int j = 1; j < k; j++)
if ((Math.abs(k - j) == Math.abs(x[j] - x[k])) || (x[j] == x[k]))
return false;
return true;
}
public static void main(String[] args) {
// 输入皇后的个数
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String str = in.nextLine();
if (str != null) {
n = Integer.parseInt(str);
sum = 0;
x = new int[n + 1];
for (int i = 0; i <= n; i++)
x[i] = 0;
BackTrack(1);
System.out.println(sum);
} else {
System.out.println("请输入正确的数组~");
}
}
}
}