递归——八皇后问题(Java源代码)

public class Main {
/*
* 问题描述:
* 八皇后问题:在8*8的国际象棋上摆放8个皇后,使其不能相互攻击,即八个皇后不能
* 处于同一行,同一列,或者同一斜线
* 问:一共有多少种解法(92)
/
/

* 问题思路:
* 本来要通过创建一个2维数组分别表示8个皇后的位。
* 这里进行优化,创建一个int[] val=new int[8] 一维数组
* val[0]=0,表示第(0+1)个皇后在第(0+1)列
*
*/
public static void main(String[] args) {
Queen8 queen=new Queen8();
queen.cheek(0);
System.out.println(“一共有”+Queen8.count+“种摆列的方法”);
}
}

class Queen8{
public int max=8;//皇后的个数
public int[] array=new int[8];//用来存放8个皇后的位置
public static int count=0;//用来计算八皇后问题一共有多少种解法

//当满足8皇后摆放的条件时,输入
public void print() {
	count++;
	for(int i=0;i<array.length;i++) {
		System.out.print(array[i]+" ");
	}
	System.out.println();
}

//判断第n个皇后摆放的位置是否满足条件
public boolean isTrue(int n) {
	for(int i=0;i<n;i++) {
		/*
		 * 判断第n个皇后摆放的位置是否合理:
		 * 1.不在同一列  通过上面的for循环就可以使其不在同一行
		 * 2.array[i]==array[n]  可以是其不在同一列
		 * 3.  Math.abs(n-i)==Math.abs(array[n]-array[i] 如果其相等,则这俩个皇后点所练成的
		 * 直线的斜率为1,就在同一条直线上
		 */
		if(array[i]==array[n]||Math.abs(n-i)==Math.abs(array[n]-array[i])) {
			return false;
		}
	}
	return true;
}

//判断第n个皇后摆放的位置
public void cheek(int n) {
	/*
	 * 如果n==8的话     就证明前8个都满足摆放条件,,所以就找到一种摆放情况,输出
	 */
	if(n==max) {
		print();
		return;
	}
	for(int i=0;i<max;i++) {//将第n个皇后从第1列开始到第8列开始遍历
		array[n]=i;
		if(isTrue(n)) {//如果第n个皇后满足摆放的条件,就去递归判断第n+1个皇后是否满足摆放条件
			cheek(n+1);
		}
	}
}

}

结果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值