小明最近喜欢搭数字积木,
一共有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); } }