1.问题描述:
在一个8*8的棋盘上放置8个皇后,不允许任何两个皇后在棋盘的同一行、同一列和同一对角线上。
2.分析
1)
对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]的同一列上。
2)
每行有且仅有一个皇后:声明数组Queen[8] 存放皇后位置//Queen[n]数组的含义为将第n个皇后放在格子的(n,Queen[n])位置
public static int Place(int n)//判断(n,Queen[n])位置是否可以放皇后
package Queen;
public class Queen {
static int Max=8; //皇后的个数
static int []Queen=new int[Max]; //Queen[n]数组的含义为将第n个皇后放在格子的(n,Queen[n])位置
static int count=0; //记录总计有多种放置方式
public static int Place(int n)//判断(n,Queen[n])位置是否可以放皇后
{
int i;
for(i=0;i<n;i++)
{
if(Queen[i]==Queen[n]||Math.abs(Queen[n]-Queen[i])==n-i)//判断是否在同一列或者对角线上,Queen[i]==Queen[n]判断同一列是否有皇后
//Math.abs(Queen[n]-Queen[i])==n-i)判断对角线上是否有皇后
return 0;//同一列或者对角线上有皇后时该位置不能放皇后
}
return 1;//可以放皇后
}
public static void NQueen(int n)//放置第n行的皇后
{
int i=0;
for(i=0;i<Max;i++)
{
Queen[n] = i;
if(Place(n)==1){
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) {
NQueen(0); //初始放置第一行的皇后
System.out.print("共有"+count+"种方式");
}
}