1. 程式人生 > >搭積木(回溯法)

搭積木(回溯法)

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;
	}
}