n 皇后

package Search;
import static java.lang.System.out;
public class Queen {
	public static int sum = 0;
	public static void main(String args[])
	{
		getQueen(5);
		
	}
	public static void getQueen(int n)
	{
		int[] queen = new int[n+1];
		int[] result = new int[n+1];
		for(int i=1;i<=n;i++)
			queen[i] = i;
		
		System.out.println("输出结果如下:行->列");
		trial(queen,result,1);
		System.out.println("共 "+sum+" 个");
	}
	public static void trial(int[]queen,int[]result,int i) // i 表示行
	{	
		if(i>queen.length-1)
		{
			sum++;
			for(int s = 1;s<result.length;s++)
				System.out.print(s+"->"+result[s]+",");
			System.out.println();
		}
		else
		{
			for(int k=1;k<queen.length;k++)//K表示列,意思就是第I行看看应该放哪个列上,所以要查找所以的列
			{
					result[i] = k;//第 i 行为第K列,当行确定下来的时候,(i表示的行已经确定下来了),我们就查找它的所有可能的列值
					if(isPut(result,i))//将i 作为参数,也就是将i,k两个值传了过去,因为K=result[i],也就是看看[i,a[i]]这个坐能不能放下
					{		// 如果能放下的话,就直接放下一行,如果不能的话,就再换一个列
						trial(queen,result,i+1);
					}
			}
		}
	}
	public static boolean isPut(int a[],int k) {//查看第K行,第a[k]列是否适合放位置
		for(int i=1;i<k;i++)//  因为K是要放的行,在这之前K行以的值都已经被放入,所以就和小于K的数比较
			if(a[i]==a[k]||(Math.abs(i-k)==Math.abs(a[i]-a[k])))
					return false;
		return true;
	}
}
/*
 * 		数据结构: a[i]  i表示行,a[i] 表示列 ,因为只要求价值位置,也就是行列值,并不要求这个坐标内的值是多少,所以
 * 		用一维数组就可以搞定了	
 * 		用回溯法得到一个求皇后问题的解空间树,然后利用深度优先搜索的方法查找这个解空间树,
 * 		在查找的过程中,为了加快效率,设置一个约束,就是查找同一行, or 同一列,or 同一斜线的点就不要向下查了,因为它们已经不满足了皇后问题
 * 
 * 
 * 		其实皇后问题就是一个填充矩阵的问题
 * */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值