N皇后问题要求求解N*N的棋盘上放置N个皇后,并使各皇后彼此不受攻击的所有可能的棋盘布局
皇后彼此不受攻击的约束条件是:任何两个皇后均不能在同一行,同一列,或者同一对角线
思路:采用一维数组X表示N皇后的解,X【i】的值表示第i行皇后所在的列号
采用一维数组本身的数据结构就很好解决了任何两个皇后不会出现在同一行中,因此,只需考虑任意两个皇后不能在同一列,和对角元素即可
不出现在同一列的条件:X[i]!=x[s]
row行 与 s行不出现在对角线的条件:|row-s| = |x[row] - x[s]|
采用StringBuffer 进行数据的存储,保存每一个结果:
代码实现:
import java.util.Scanner;
public class Tria {
private static StringBuffer buffer = new StringBuffer();
private static int test =0;
public Tria() {
}
public static boolean isRightPlace(int[] x, int row) {
//比较该行与在此之上的每一行位置比较
for(int i = 0;i<row;i++) {
if(x[i]==x[row]||Math.abs(row-i)==Math.abs(x[row]-x[i])) {
return false;
}
}
return true;
}
//在每一行上放置皇后
public static StringBuffer setQueen(int[] x,int i,int n) {
if(i==n) {
for(int k =0;k<n;k++) {
buffer.append(x[k]);
}
test++;
buffer.append(" ");
}else {
for(int j=0;j<n;j++) {
x[i] = j;
if(isRightPlace(x, i)) {
System.out.println("第"+i+"的初始放置元素为"+j);
setQueen(x, i+1, n);
}
}
}
return buffer;
}
public static void main(String[] args) {
int count;
System.out.println("请输入棋盘数据");
Scanner scanner = new Scanner(System.in);
count = scanner.nextInt();
scanner.close();
int[] x = new int[count];
StringBuffer list = setQueen(x,0, count);
System.out.println(list);
System.out.println(test);
}
}