搭积木 小明最近喜欢搭数字积木,
一共有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<stdio.h>#include<stdlib.h>int visited[10]={0}; //查看该元素是否被访问int a[10] = {0,1,2,3,4,5,6,7,8,9};int sum = 0; //定义全局变量sum来进行对符合条件的组合计数int test(int n){ //对不适合的进行剪枝 if(n == 2){ if(a[0]<a[1]&&a[0]<a[2]){ return 1; } return 0; } else if(n == 5){ if(a[1]<a[3]&&a[1]<a[4]&&a[2]<a[4]&&a[2]<a[5]){ return 1; } return 0; } else if(n == 9){ if(a[3]<a[6]&&a[3]<a[7]&&a[4]<a[7]&&a[4]<a[8]&&a[5]<a[8]&&a[5]<a[9]){ sum++; return 1; } return 0; } else return 1;}void dfs(int n){ int i; for(i=0;i<10;i++){ if(!visited[i]){ visited[i]=1; a[n]=i; //除了以下三行判断是否满足搭积木的规则 //,其余就是标准的dfs(); if(!test(n)){ visited[i]=0; continue; } dfs(n+1); visited[i]=0; } }}int main(){ dfs(0); PRintf("%d/n",sum);//sum == 768 return 0;}寒假作业
现在小学的数学题目也不是那么好玩的。
看看这个寒假作业:
□ + □ = □ □ - □ = □ □ × □ = □ □ ÷ □ = □ (如果显示不出来,可以参见【图1.jpg】)
每个方块代表1~13中的某一个数字,但不能重复。
比如:
6 + 7 = 13 9 - 8 = 1 3 * 4 = 12 10 / 2 = 5 以及:
7 + 6 = 13 9 - 8 = 1 3 * 4 = 12 10 / 2 = 5 就算两种解法。(加法,乘法交换律后算不同的方案)
你一共找到了多少种方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
答案 (8分)
#include<iostream> //包含memset(数组名,0/-1(只能是将数组中所有元素初始化这两个数),sizeof(数组名)) //算法头文件,其中包含许多好用的库函数using namespace std;int a[120],book[20]={0},sum=0; //book数组是用来标记1-13哪个数已经被用过了,用过则记为1,否则记为0;void dfs(int x){ if(x>3&&a[1]+a[2]!=a[3]) //如果前三个数已经被取出来但不符合题设条件,则返回重找 return; if(x>6&&a[4]-a[5]!=a[6]) //若前三个数满足第一条,看4-6个数是否满足第二个条件 return; if(x>9&&a[7]*a[8]!=a[9]) //同上 return; if(x>12&&a[12]*a[11]==a[10]) //如果所有条件均满足,则让sum++ { sum++; return; } for(int i=1;i<14;i++) //将1-13放入每一个格子中 { if(book[i]==0) //若该数字没被用过则可以用,进入下一步 { a[x]=i; book[i]=1; dfs(x+1); book[i]=0; } } return;}int main(){ dfs(1); cout<<sum; return 0;}新闻热点
疑难解答