搭积木(回溯法)

本文介绍了一个搭积木问题的求解方法,通过使用回溯算法,探讨了如何在满足特定条件下搭建积木。代码中定义了一个搭积木类,通过静态数组和布尔数组记录积木的状态,利用递归回溯方法遍历所有可能的搭建方案,统计满足条件的解的数量。
摘要由CSDN通过智能技术生成
package 习题;

public class 搭积木 {
	static int a[]=new int[10];
	static boolean num[]=new boolean[10];
	static int count=0;
	public static void main(String[] args) {
		for(int i=0;i<10;i++) {
			num[i]=true;
		}
		backtrack(0);
		System.out.println(count);
		
	}
	public static void backtrack(int n) {
		if(n>1 && !isOk(n-1)) {  //不满足就结束,
			return;
		}
		if( n==10 && isOk(n-1)){  //满足+1
			count++;
			return;
		}
		for(int i=0;i<10;i++) {  //回溯法
			if(num[i]==true) {
				a[n]=i;
				num[i]=false;
				backtrack(n+1);
				num[i]=true;
			}
		}
	}
	public static boolean isOk(int n) {  //判断是否符合要求
		boolean flag = false;
		switch(n){
			case 1:flag=(a[0]<a[1]);break;
			case 2:flag=(a[0]<a[2]);break;
			case 3:flag=(a[1]<a[3]);break;
			case 4:flag=(a[1]<a[4]&&a[2]<a[4]);break;
			case 5:flag=(a[2]<a[5]);break;
			case 6:flag=(a[3]<a[6]);break;
			case 7:flag=(a[3]<a[7]&&a[4]<a[7]);break;
			case 8:flag=(a[4]<a[8]&&a[5]<a[8]);break;
			case 9:flag=(a[5]<a[9]);break;
		}
		return flag;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值