n皇后问题

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>




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值