搭积木

小明最近喜欢搭数字积木,

一共有10块积木,每个积木上有一个数字,0~9。


搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。

下面是两种合格的搭法:

   0
  1 2
 3 4 5
6 7 8 9

   0
  3 1
 7 5 2
9 8 6 4    

请你计算这样的搭法一共有多少种?

第一种方法:暴力破解法

public class Main{

	public static void main(String[] args) {
		
		int count=0;
		
		int a,b,c,d,e,f,g,h,i,j;
		
		for(a=0;a<10;a++)  
		for(b=0;b<10;b++)  
	    for(c=0;c<10;c++)  
	    for(d=0;d<10;d++)  
	    for(e=0;e<10;e++) 
	    for(f=0;f<10;f++)  
	    for(g=0;g<10;g++)  
	    for(h=0;h<10;h++)  
	    for(i=0;i<10;i++)
	    for(j=0;j<10;j++)
	    	
	            if(a!=b && a!=c && a!=d && a!=e && a!=f && a!=g && a!=h && a!=i && a!=j &&  
	               b!=c && b!=d && b!=e && b!=f && b!=g && b!=h && b!=i && b!=j && 
	               c!=d && c!=e && c!=f && c!=g && c!=h && c!=i && c!=j && 
	               d!=e && d!=f && d!=g && d!=h && d!=i && d!=j &&
	               e!=f && e!=g && e!=h && e!=i && e!=j && 
	               f!=g && f!=h && f!=i && f!=j &&
	               g!=h && g!=i && g!=j &&
	               h!=i && h!=j &&
	               i!=j){ 
	            	
	            	if(a<b && a<c){
	            		if(b<d && b<e && c<e && c<f){
	            			if(d<g && d<h && e<h && e<i && f<i && f<j ){
	            				
	            				count++;
	            			}
	            		}
	            	}
	             }
			
			System.out.println(count);     //768
			
	    }
  }

第二种方法:dfs

public class Main{
	
	public static int count=0;
	
	public static void swap(int[] A,int a,int b){
		
		int temp=A[a];
		
		A[a]=A[b];
		
		A[b]=temp;
		
	}
	
	public static void dfs(int[] A,int step){
		
		if(step==A.length){
			
			if(check(A)){
				
				count++;
			}
				
		}else{
			
			for(int i=step;i<A.length;i++){
				
				swap(A, i, step);
				
				dfs(A, step+1);
				
				swap(A, i, step);
				
			}
		}		
	}
	
	public static boolean check(int[] A){
		
		if(A[0] < A[1] && A[0] < A[2]){
			
			if(A[1] < A[3] && A[1] < A[4] && A[2] < A[4] && A[2] < A[5]){
				
				if(A[3] < A[6] && A[3] < A[7] && A[4] < A[7] && A[4] < A[8] && A[5] < A[8] && A[5] < A[9]){
					
					return true;
					
				}
			}
		}
		
		return false;
		
	}
	
	public static void main(String[] args){
		
		int [] A={0,1,2,3,4,5,6,7,8,9}; 
		
		dfs(A, 0);
		
		System.out.println(count);   
	}
}





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值