首页 > 学院 > 开发设计 > 正文

蓝桥搜索题

2019-11-10 18:38:26
字体:
来源:转载
供稿:网友

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

一共有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;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表