搭積木(回溯法)
阿新 • • 發佈:2018-11-28
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; } }