问题描述:

在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("请输入正确的数组~");

}



}

}

}