递归--8皇后问题

8皇后问题:
8*8的国际象棋中,摆8个皇后,任意两个皇后之间都不会处于同一行,同一列或者是同一斜线上,问有多少中摆法?
思路:

  1. 第一个换后先放在第一行第一列
  2. 第二个皇后放在第二行的第一列开始,判断是否可行,如果不可行,则继续放在第二列,第三列。。。直到找到合适的位置
  3. 继续放置第三个皇后,如同步骤2
  4. 当得到一个正确解的时候,递归中的栈退回到上一个栈时,就会开始回溯,即将第一个皇后放在第一列的所有正确解得到
  5. 然后回头继续将第一个皇后放在第二列,。。。后面陆续执行2345678列

代码

public class Queue {
   int maxSize=8;//皇后的数量
   int[] array=new int[maxSize];//array[i]表示第i行第array[i]列
   static int count=0;//多少种解法
   public static void main(String[]args) {
       Queue queue=new Queue();
       queue.check(0);//从0开始放
       System.out.println("共有"+count+"种结果");
	   
   }
   
   private void check(int n) {
	   if(n==maxSize) {
		   //表示已经到放置第九个(0-8)
		   printf();
		   count++;
		   return;
	   }
	   
	   for(int i=0;i<maxSize;i++) {
		   array[n] = i;//先把当前这个皇后 n , 放到该行的第1列,array[n]==i表示从第1列开始,i初始值为0
		   //判断当放置第n个皇后到第i列的时候,会不会冲突
		   if(judge(n)) {
			   //如果不冲突,就放置下一个皇后
			   check(n+1);
		   }
		   //如果冲突,i++
	   }
   }
   
   
   
   
   //判断皇后的位置是否可以放置
   /**
    * 
    * @param n表示第n个皇后
    * @return
    */
   private boolean judge(int n) {
	  for(int i=0;i<n;i++) {
		  //(array[i]==array[n]表示两个皇后在同一列  array[i]表示第array[i]列
		  //Math.abs(i-n)==(Math.abs(array[i]-array[n]))表示两个皇后在同一斜线上
		  if(array[i]==array[n]||Math.abs(n-i)==(Math.abs(array[n]-array[i]))) {
			  return false;
		  }
	  }
	  return true;
   }
   
   
   //输出结果方法
   private void printf() {
	   for(int i=0;i<array.length ;i++) {
		   System.out.printf(array[i]+" ");
	   }
	   System.out.println();
   }
 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值