n皇后问题是由八皇后问题扩展而来的:在n*n的方格棋盘上 ,放置n个皇后,要求每个皇后不同行,不同列,不同左右对角线。
思路:用递归思想来解决问题。设place(k,n)是在1~k-1列上已经放置好了k-1个皇后,用于在k~n列放置n-k+1个皇后,显然place
(k+1,n)表示已经在1~k列已经放置好了k个皇后,用于在k+1~n列放置n-k个皇后。可以看出place(k+1,n)比place(k,n)少放置了1个皇后。
设place(k+1,n)是一个“小问题”,place(k,n)是“大问题”,则求解皇后问题的递归模型如下:
place(i,n): n个皇后放置完毕,输出解 i>.n
place(k,n):对于第k列的每一个合适的位置i,在其上放置一个皇后; 其他
place(k+1,n);
得到递归过程如下:
place(int k,int n){
if(k>n)
输出一个解;
else
for(int i=0;i<=n;i++){
if(第k列的第i行合适){
在位置处放一个皇后及q[k]=i
place(k+1,n);
}
}
下面是8皇后的算法代码:
public class EightQueen { //八皇后问题
public static final int N=8;
public static int[] q = new int[N+1];//存放各皇后所在的行号
int count=0; //记录解的个数
public static void main(String[] args){
EightQueen e = new EightQueen();
e.place(1,N);
}
public void print(int N){ //输出一个解
count++;
System.out.println("第"+count+"种走法 ");
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(i==q[j]){
System.out.print("0 ");
}else
System.out.print("+ "); }
System.out.println(); }
}
public void place(int k,int N){ //第k个皇后放在第k列上
if(k>N){ print(N);} //所有皇后摆放结束
else{
for(int i=1;i<=N;i++){ //在第k列上穷举每一个位置
if(find(i,k)==1){
q[k]=i;
place(k+1,N);
}
}
}
}
public int find(int i,int k){ //测试第k列的第i行能否摆放皇后
int j=1;
while(j<k){ //j=1到k-1是已经放置了皇后的列
if((q[j]==i)//第j列皇后是否在i行上
||(Math.abs(q[j]-i)==Math.abs(j-k))) //位置q(x[j],j)与i,k)是否在同一对角线上
return 0;
j++;}
return 1;
}
}
<span style="font-size:18px;">下面是部分运行结果,可以看出八皇后一共有92中走法</span>