package datasystem;
/**
* 描述:在一个8*8的棋盘上放置8个皇后,不允许任何两个皇后在棋盘的同一行、同一列和同一对角线上。
*
* 对8 x 8的二维数组上的某点a[i][j](0<=i,j<=7)
* 如果a[s][q]满足|s-i|=|q-j|,a[s][q]在a[i][j]的对角线上。
* 如果s=i,则a[s][q]在a[i][j]的同一列上。
*
* 每行有且仅有一个皇后:
* 声明数组Queen[8] 存放皇后位置//Queen[n]数组的含义为将第n个皇后放在格子的(n,Queen[n])位置
public static int Place(int n)//判断(n,Queen[n])位置是否可以放皇后
*
*
* @author ASUS
* @date 2018年6月16日
*/
public class EightQueens {
//皇后的个数
private static int Max=8;
//Queen[n]数组的含义为将第n个皇后放在格子的(n,Queen[n])位置
private static int []Queen=new int[Max];
//记录总计有多种放置方式
private static int count=0;
//判断(n,Queen[n])位置是否可以放皇后
public static boolean Place(int n) {
int i;
for(i=0;i<n;i++) {
//Math.abs(Queen[n]-Queen[i])==n-i)判断对角线上是否有皇后
//Queen[i]==Queen[n]判断同一列是否有皇后
if(Queen[i]==Queen[n]||Math.abs(Queen[n]-Queen[i])==n-i)//判断是否在同一列或者对角线上
//同一列或者对角线上有皇后时该位置不能放皇后
return false;
}
//可以放皇后
return true;
}
//放置第n行的皇后
public static void NQueen(int n) {
int i=0;
for(i=0;i<Max;i++) {
Queen[n] = i;
if(Place(n)==true){
//八个皇后全部放完
if(n==Max-1) {
//输出八个皇后的位置
Show();
//一次放置完换行
System.out.println();
//放置方式加一
count++;
}else{
//放置下一行的皇后
NQueen(n+1);
}
}
}
}
public static void Show() {
for(int i=0;i<Max;i++) {
System.out.print("("+i+","+Queen[i]+")");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
NQueen(0); //初始放置第一行的皇后
System.out.print("共有"+count+"种方式");
}
}