蓝桥杯比赛关于 BFS 算法总结方法以及套路分析
首先我们来看几道java A组的题目,都是同一年的哦!!!
搭积木
小明最近喜欢搭数字积木,
一共有10块积木,每个积木上有一个数字,0~9。
搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。
下面是两种合格的搭法:
0
1 2
3 4 5
6 7 8 9
0
3 1
7 5 2
9 8 6 4
请你计算这样的搭法一共有多少种?
请填表示总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
先帖代码:
public class test4 {
int a[]=new int[20]; //java 数组初始化值为0
int visit[]=new int[20]; //判断是否使用过
static int count1=0;
public void dfs1(int x){
if(x==10){
if(a[0]<a[1]&&a[0]<a[2] //这里没有进行剪枝操作,因为不方便
&&a[1]<a[3]&&a[1]<a[4]&&a[2]<a[4]&&a[2]<a[5]
&&a[3]<a[6]&&a[3]<a[7]&&a[4]<a[7]&&a[4]<a[8]&&a[5]<a[8]&&a[5]<a[9]){
count1++;
return;
}
}
for(int i=0;i<10;i++){
if(visit[i]==0){ //深度搜索套路代码,只可意会
a[x]=i;
visit[i]=1;
dfs1(x+1);
visit[i]=0;
}
}
return; //这个return是当前面的所有的都不成立时回溯(return)到最初调用for循环内的dfs处
}
public static void main(String[] args){
new test4().dfs1(0);
System.out.println(count1);
}
}
结果:768
题目二:
寒假作业
现在小学的数学题目也不是那么好玩的。
看看这个寒假作业:
□ + □ = □
□ - □ = □
□ × □ = □
□ ÷ □ = □
(如果显示不出来,可以参见【图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
就算两种解法。(加法,乘法交换律后算不同的方案)
你一共找到了多少种方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
代码:
public class test3 {
int a[]=new int[20]; //java 数组初始化值为0
int visit[]=new int[20];
static int count=0;
public 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]) //如果所有条件均满足,则让count++
{
count++;
return;
}*/
if(x>12){
if((a[1]+a[2]==a[3])&&(a[4]-a[5]==a[6])&&(a[7]*a[8]==a[9])&&(a[12]*a[11]==a[10])){
count++;
return;
}
}
for(int i=1;i<14;i++){
if(visit[i]==0){ //深度搜索套路代码
a[x]=i;
visit[i]=1;
dfs(x+1);
visit[i]=0;
}
}
return; //这个return是当前面的所有的都不成立时回溯(return)到最初调用for循环内的dfs处
}
public static void main(String[] args){
new test3().dfs(1);
System.out.println(count);
}
}
结果: 64
第三题:
方格填数
如下的10个格子
+--+--+--+
|0 | 1| 2|
+--+--+--+--+
| 3| 4| 5| 6|
+--+--+--+--+
| 7| 8| 9|
+--+--+--+
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
代码:
public class test5 {
int a[]=new int[20]; //java 数组初始化值为0
int visit[]=new int[20]; //判断是否使用过
static int count1=0;
public void dfs1(int x){
if(x==10){
if(
(Math.abs(a[0]-a[1])!=1)&&
(Math.abs(a[0]-a[3])!=1)&&
(Math.abs(a[0]-a[4])!=1)&&
(Math.abs(a[0]-a[5])!=1)&&
(Math.abs(a[1]-a[2])!=1)&&
(Math.abs(a[1]-a[4])!=1)&&
(Math.abs(a[1]-a[5])!=1)&&
(Math.abs(a[1]-a[6])!=1)&&
(Math.abs(a[2]-a[5])!=1)&&
(Math.abs(a[2]-a[6])!=1)&&
(Math.abs(a[3]-a[0])!=1)&&
(Math.abs(a[3]-a[4])!=1)&&
(Math.abs(a[3]-a[7])!=1)&&
(Math.abs(a[3]-a[8])!=1)&&
(Math.abs(a[4]-a[5])!=1)&&
(Math.abs(a[4]-a[7])!=1)&&
(Math.abs(a[4]-a[8])!=1)&&
(Math.abs(a[4]-a[9])!=1)&&
(Math.abs(a[5]-a[6])!=1)&&
(Math.abs(a[5]-a[8])!=1)&&
(Math.abs(a[5]-a[9])!=1)&&
(Math.abs(a[6]-a[9])!=1)&&
(Math.abs(a[7]-a[8])!=1)&&
(Math.abs(a[8]-a[9])!=1)
){
count1++;
return;
}
/* if(a[0]!=a[1]&&a[0]!=a[3]&&a[0]!=a[4]&&a[0]!=a[5]
&&a[1]!=a[0]&&a[1]!=a[2]&&a[1]!=a[4]&&a[1]!=a[5]&&a[1]!=a[6]
&&a[2]!=a[1]&&a[2]!=a[5]&&a[2]!=a[6]
&&a[3]!=a[0]&&a[3]!=a[0]&&a[3]!=a[7]
&&a[4]!=a[0]&&a[4]!=a[1]&&a[4]!=a[3]&&a[4]!=a[5]&&a[4]!=a[7]&&a[4]!=a[8]&&a[4]!=a[9]
&&a[5]!=a[0]&&a[5]!=a[1]&&a[5]!=a[2]&&a[5]!=a[4]&&a[5]!=a[6]&&a[5]!=a[8]&&a[5]!=a[9]
&&a[6]!=a[1]&&a[6]!=a[2]&&a[6]!=a[5]&&a[6]!=a[9]
&&a[7]!=a[3]&&a[7]!=a[4]&&a[7]!=a[8]
&&a[8]!=a[3]&&a[8]!=a[4]&&a[8]!=a[5]&&a[8]!=a[7]&&a[8]!=a[9]
&&a[9]!=a[4]&&a[9]!=a[5]&&a[9]!=a[6]&&a[9]!=a[8]){
count1++;
return;
}*/
}
for(int i=0;i<10;i++){
if(visit[i]==0){ //深度搜索套路代码,只可意会
a[x]=i;
visit[i]=1;
dfs1(x+1);
visit[i]=0;
}
}
return; //这个return是当前面的所有的都不成立时回溯(return)到最初调用for循环内的dfs处
}
public static void main(String[] args){
new test5().dfs1(0);
System.out.println(count1);
}
}
执行结果: 1580
蓝桥杯比赛关于 BFS 算法总结方法以及套路分析的更多相关文章
- C语言蓝桥杯比赛原题和解析
蓝桥杯:在计算机编程领域,是具有一定含金量的竞赛,用于选拔信息技术人才. 一般分为多个领域,其中包含了C/C#/C++/Java/Python等编程语言的测试题,多为算法的设计题. 下面,在搜题过程中 ...
- 蓝桥杯比赛java 练习《立方变自身》
立方变自身 观察下面的现象,某个数字的立方,按位累加仍然等于自身.1^3 = 1 8^3 = 512 5+1+2=817^3 = 4913 4+9+1+3=17... 请你计算包括1,8, ...
- 蓝桥杯比赛javaB组练习《方格填数》
方格填数 如下的10个格子 +--+--+--+ | | | |+--+--+--+--+| | | | |+--+--+--+--+| | | |+--+--+--+ ( ...
- 蓝桥杯 穿越雷区(bfs)
题目描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废.某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短? ...
- 蓝桥杯 卡片换位(bfs)
卡片换位 你玩过华容道的游戏吗?这是个类似的,但更简单的游戏.看下面 3 x 2 的格子 在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵.还有一个格子是空着的. 你可以把一张牌移动到相邻的空 ...
- 蓝桥杯 调手表(bfs解法)
小明买了块高端大气上档次的电子手表,他正准备调时间呢. 在 M78 星云,时间的计量单位和地球上不同,M78 星云的一个小时有 n 分钟. 大家都知道,手表只有一个按钮可以把当前的数加一.在调分钟的时 ...
- 蓝桥杯比赛javaB组练习《生日蜡烛》
题目如下: 生日蜡烛 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填写他开始 ...
- 蓝桥杯比赛javaB组练习《四平方和》
四平方和 四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和.如果把0包括进去,就正好可以表示为4个数的平方和. 比如:5 = 0^2 + 0^2 + 1^2 + 2^27 ...
- 蓝桥杯比赛javaB组练习《牌型种数》
牌型种数 小明被劫持到X赌城,被迫与其他3人玩牌.一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张.这时,小明脑子里突然冒出一个问题:如果不考虑花色,只考虑点数,也不考虑自己得到的牌 ...
随机推荐
- XML配置文件中写版本号.xsd和不写版本号的区别
如果写版本号则默认从网上下载并指定最新版本,如果不写版本号则默认从本地下载并使用最新版本.
- jquery.qrcode.min.js(支持中文转化二维码)
详情请看:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/jqueryqrcodeminjs/ 今天还是要讲一下关于二维码的知识,前 ...
- [USACO07NOV]电话线Telephone Wire
[USACO07NOV]电话线Telephone Wire 时间限制: 1 Sec 内存限制: 128 MB 题目描述 电信公司要更换某个城市的网线.新网线架设在原有的 N(2 <= N &l ...
- Swift自增和自增运算
自增和自增运算 和 C 语言一样,Swift 也提供了方便对变量本身加1或减1的自增(++)和自减(--)的运算符.其操作对象可以是整形和浮点型. var i = ++i // 现在 i = 1 ...
- 将Win7系统将默认打开的库改为计算机
- windows上将代码上传到Github
Repository name: 仓库名称 Description(可选): 仓库描述介绍 Public, Private : 仓库权限(公开共享,私有或指定合作者) Initialize this ...
- 读RCNN论文笔记
1. RCNN的模型(如下图)描述: RCNN相比传统的物体检测,还是引入传统的物体检测的基本流程,先找出候选目标物体,逐个的提取特征,不过rbg大神引入了当时炙手可热的CNN卷积网络取代传统上的HO ...
- java--while、do while、for三种循环体
1.for可以记录执行次数: 2.while.do while的i放在sum的后面和for得到的执行次数和结果是一致的. 1.从执行结果来看,放在前面,虽然执行次数和i放在sum的后面是相同,但是结果 ...
- 简单来说一下ui-route
UI-Router被认为是AngularUI为开发者提供的最实用的一个模块,它是一个让开发者能够根据URL状态或者说是'机器状态'来组织和控制界面UI的渲染,而不是仅仅只改变路由(传统AngularJ ...
- 使用hexdump追踪FAT32文件系统中的一个文件
最近在看文件系统基础结构等知识,本来重点是想看EXT4文件系统,但是目前没有找到比较详细说明EXT4文件系统详细结构的,用EXT3的对应着找结果有点出入,在想是不是我用hexdump的参数有问题,于是 ...