n-皇后问题是4 -皇后问题的推广。n个皇后将被放置在n×n的棋盘上且使得没有两个皇后可以互相攻击。解空间由n-元组(1,2,…,n)的n!个排列所组成。 n=1,解为1,n=2,3,无解。下图给出了当n=4时的树结构。像这样的一棵树称为排列树。树的边由xi的可能的取值标记。由i级到i+1级节点的边给出xi的值。解空间由从根节点到叶节点的所有路径定义。
以四皇后为例:
代码实现:
import java.util.Scanner;
public class queue {
static int n;
int[] a=new int [21];
void print(){ //打印棋子
int i;
for( i=1;i<=n;i++){
System.out.print(a[i]+" ");
}
System.out.println();
if(i%7==0){
System.out.println();
}
}
void printgraph() //图形化打印布局
{
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
if(a[i]==j)
System.out.print("*"+" ");
else
System.out.print("0"+" ");
System.out.println();
}
System.out.println();
}
int Try(int x,int y){ //测试x行y列可否摆放棋子,成功返回1,否则返回0
int j=1;
while(j<x) //与数组中已摆放好的数比较
{
if((a[j]==y)||(Math.abs(x-j)==Math.abs(a[j]-y)))
return 0;
++j; //右移一格继续尝试
}
return 1;
}
void place(int x) //递归函数
{
int y;
if(x>n) //棋子第n行已摆好,则打印成功方案
{
print();
printgraph(); //打印图形化布局
}
else
{
for(y=1;y<=n;++y) //该行棋子依次从左向右移
if(Try(x,y)==1) //如果可以摆放
{
a[x]=y; //给a[x]赋值
place(x+1); //继续下一行的递归
}
}
}
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
n=s.nextInt();
queue q=new queue();
q.place(1);
}
}
截图: