搭积木

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

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

搭积木规则:

每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。

最后搭成4层的金字塔形,必须用完所有的积木。

下面是两种合格的搭法:

   0
  1 2
 3 4 5
6 7 8 9

   0
  3 1
 7 5 2
9 8 6 4    

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

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

答案 (5分)

代码:

#include <iostream>
#include <cstdio>

using namespace std;
int s[11];
bool vis[10];
int c;
int d[7][2] = {0,0,2,3,4,5,5,6,7,8,8,9,9,10};
bool check() {
    for(int i = 1;i <= 6;i ++) {
        if(s[i] > s[d[i][0]] || s[i] > s[d[i][1]]) return false;
    }
    return true;
}
void dfs(int k) {
    if(k > 10) {
        if(check()) c ++;
        return;
    }
    for(int i = 0;i < 10;i ++) {
        if(!vis[i]) {
            vis[i] = true;
            s[k] = i;
            dfs(k + 1);
            vis[i] = false;
        }
    }
}
int main() {
    dfs(1);
    printf("%d",c);
}
public class Main {
    private static int [] s = new int[10];
    private static int c = 0;
    private static int [] dl = {1,3,4,6,7,8};
    private static int [] dr = {2,4,5,7,8,9};
    private static boolean [] vis = new boolean[10];
    private static boolean check() {
        for(int i = 0;i < 6;i ++) {
            if(s[i] > s[dl[i]] || s[i] > s[dr[i]]) return false;
        }
        return true;
    }
    private static void dfs(int k) {
        if(k >= 10) {
            if(check()) c ++;
            return;
        }
        for(int i = 0;i < 10;i ++) {
            if(vis[i]) continue;
            vis[i] = true;
            s[k] = i;
            dfs(k + 1);
            vis[i] = false;
        }
    }
    public static void main(String[] args) {
        dfs(0);
        System.out.println(c);
    }
}
原文地址:https://www.cnblogs.com/8023spz/p/10365667.html