搭积木(全排列变体)

/**
* 小明最近喜欢搭数字积木,
一共有10块积木,每个积木上有一个数字,0~9。

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

下面是两种合格的搭法:

0
1 2
3 4 5
6 7 8 9

0
3 1
7 5 2
9 8 6 4

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

请填表示总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

*/

思路

这就是一个全排列,为什么这么说呢?我们可以为四层积木的每个位置编一个号,这样其实可以看成一个数组,我们把0~9十个数字做一个全排列,然后过滤掉不合规则的排列即可。

代码

public class _024全排列应用_搭积木 {
  public static void main(String[] args) {
    for (int i = 0; i < 10; i++) {
      src[i] = i;
    }
    f("");
    System.out.println(count);
  }
  static int[] src = new int[10];
  static int count;
  static void f(String prefix){
  //出口
    if (prefix.length()==src.length){
      //过滤合法解
      if (check(prefix))
        count++;
      return;
    }

    for (int i = 0; i <src.length ; i++) {
      if (!prefix.contains(src[i]+"")) {//字符可用
        f(prefix+src[i]);
      }
    }
  }

  /**
      0
     1 2
    3 4 5
   6 7 8 9
   * @param prefix
   * @return
   */
  private static boolean check(String prefix) {
    return prefix.charAt(0)<prefix.charAt(1)&&prefix.charAt(0)<prefix.charAt(2)&&
        prefix.charAt(1)<prefix.charAt(3)&&prefix.charAt(1)<prefix.charAt(4)&&
        prefix.charAt(2)<prefix.charAt(4)&&prefix.charAt(2)<prefix.charAt(5)&&
        prefix.charAt(3)<prefix.charAt(6)&&prefix.charAt(3)<prefix.charAt(7)&&
        prefix.charAt(4)<prefix.charAt(7)&&prefix.charAt(4)<prefix.charAt(8)&&
        prefix.charAt(5)<prefix.charAt(8)&&prefix.charAt(5)<prefix.charAt(9);
  }
}

猜你喜欢

转载自blog.csdn.net/zhengwei223/article/details/80279914
今日推荐