java蓝桥杯dfs_第七届 蓝桥杯决赛 Java B组 打靶 解题报告(DFS,回溯,全排列)-Go语言中文社区...
题目:
打靶
小明参加X星球的打靶比赛。
比赛使用电子感应计分系统。其中有一局,小明得了96分。
这局小明共打了6发子弹,没有脱靶。
但望远镜看过去,只有3个弹孔。
显然,有些子弹准确地穿过了前边的弹孔。
不同环数得分是这样设置的:
1,2,3,5,10,20,25,50
那么小明的6发子弹得分都是多少呢?有哪些可能情况呢?
下面的程序解决了这个问题。
仔细阅读分析代码,填写划线部分缺失的内容。
public class Main
{
static void f(int[] ta, int[] da, int k, int ho, int bu, int sc)
{
if(ho<0 || bu<0 || sc<0) return;
if(k==ta.length){
if(ho>0 || bu>0 || sc>0) return;
for(int i=0; i
for(int j=0; j
System.out.print(ta[i] + " ");
}
System.out.println();
return;
}
for(int i=0; i<=bu; i++){
da[k] = i;
f(ta, da, k+1, __________________ , bu-i, sc-ta[k]*i); // 填空位置
}
da[k] = 0;
}
public static void main(String[] args)
{
int[] ta = {1,2,3,5,10,20,25,50};
int[] da = new int[8];
f(ta, da, 0, 3, 6, 96);
}
}注意:只填写划线处缺少的内容,不要填写已有的代码或符号,也不要填写任何解释说明文字等。
本题结论有待验证,证明后更改,主要纠结于3代表总共三个弹孔,还是三次重复穿过弹孔
如果代表总共三个弹孔 答案:i > 0 ? ho - 1: ho
如果代表总共三次重复穿过:答案:i > 1 ? ho - (i - 1) : ho
分析:
1.main函数分析:
public static void main(String[] args) {
int[] ta = { 1, 2, 3, 5, 10, 20, 25, 50 };//记录分值
int[] da = new int[8];//记录每个分值的个数
f(ta, da, k,ho,bu, sc);
f(ta, da, 0, 3, 6, 96);//第一二个参数不用解释,从ta第0位开始枚举,3个重复弹孔,上限6个分数,共96分
}
2.递归函数分析:
static void f(int[] ta, int[] da, int k, int ho, int bu, int sc) {
if (ho < 0 || bu < 0 || sc < 0)//最后ho bu sc 都大于0 才有递归的必要(剪枝)
return;
if (k == ta.length) {// 当k枚举完ta数组(类似for循环的i),开始判断
if (ho > 0 || bu > 0 || sc > 0)// 三个参数都等于0,说明递归过程会把已经枚举的值扣除相应的ho,bu,sc值
return;
for (int i = 0; i < da.length; i++) {//输出每个分值
for (int j = 0; j < da[i]; j++)
System.out.print(ta[i] + " ");
}
System.out.println();
return;
}
for (int i = 0; i <= bu; i++) {//bu是分数个数的上限
da[k] = i;//每一个分值从0~bu(即6)进行深搜枚举
f(ta, da, k + 1, i > 1 ? ho - (i - 1) : ho, bu - i, sc - ta[k] * i); // 填空位置
}
/*刚开始直接填0,发现每个答案加起来就是96,唯一不同的就是,有的弹孔数不是3个
*可见,ho的值就是用来筛选的且要扣除有几个重复的,由da数组可知每个分值是记录每个分值个数的
*所以我推出ho,当分值的个数大于1,只要减去每个分值的个数扣掉1之后的值(即重复的数量),如da[1] = 3,那么我就ho扣掉2
*最后运行,果然,得出了三组数据且只有三个弹孔,完美解决
* */
da[k] = 0;//分值每种情况枚举完之后要回溯,清零
}
把ho填0,得出的结果:
推出代码后结果:
所以应该填入:i > 1 ? ho - (i - 1) : ho
完整代码:
public class Main {
static void f(int[] ta, int[] da, int k, int ho, int bu, int sc) {
if (ho < 0 || bu < 0 || sc < 0)
return;
if (k == ta.length) {
if (ho > 0 || bu > 0 || sc > 0)
return;
for (int i = 0; i < da.length; i++) {
for (int j = 0; j < da[i]; j++)
System.out.print(ta[i] + " ");
}
System.out.println();
return;
}
for (int i = 0; i <= bu; i++) {
da[k] = i;
f(ta, da, k + 1, i > 1 ? ho - (i - 1) : ho, bu - i, sc - ta[k] * i); // 填空位置
}
da[k] = 0;
}
public static void main(String[] args) {
int[] ta = { 1, 2, 3, 5, 10, 20, 25, 50 };
int[] da = new int[8];
f(ta, da, k,ho,bu, sc);
f(ta, da, 0, 3, 6, 96);
}
}
总结:
主要还是考深搜还有回溯,跟全排列有点像,类似全排列的进阶
java蓝桥杯dfs_第七届 蓝桥杯决赛 Java B组 打靶 解题报告(DFS,回溯,全排列)-Go语言中文社区...相关推荐
- 2016蓝桥杯java试题_2016年第七届蓝桥杯JavaB组省赛试题解析
题目及解析如下: 题目大致介绍: 第一题到第三题以及第六题.第七题是结果填空,方法不限只要得到最后结果就行 第四题和第五题是代码填空题,主要考察算法基本功和编程基本功 第八题到第十题是编程题,要求编程 ...
- 蓝桥杯java生成树计数_第七届蓝桥杯决赛杂记
反正最近不想干什么正经事,回忆一下这些东西也好. 总的来说,这是我第二次去北京参加蓝桥杯决赛.去年获得了优秀奖,换句话来说就是重在参与.不过,今年成绩比去年好一点. (订的宾馆一如既往的温馨就不说了) ...
- java比赛题目_【蓝桥杯2016第七届比赛题目】JAVA A组
1 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100层,共有多少个煤 ...
- java蓝桥杯凑算是,第七届蓝桥杯JAVA B组真题解析-凑算式(第三题)
第七届蓝桥杯JAVA B组真题解析-凑算式(第三题) 凑算式 A+B/C+DEF/GHI =10 (如果显示有问题,可以参见[图1.jpg]) 这个算式中AI代表19的数字,不同的字母代表不同的数字. ...
- 2016蓝桥杯b组java试题及答案_2016年第七届蓝桥杯java B组省赛试题
2016年第七届蓝桥杯java B组省赛试题 1-3.结果填空 4-5.代码填空 6-7.结果填空 8-10.程序设计 1.煤球数目 (结果填空) 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, ...
- java中的冰雹数,java实现第七届蓝桥杯打印数字
打印数字 打印数字 小明写了一个有趣的程序,给定一串数字. 它可以输出这串数字拼出放大的自己的样子. 比如"2016"会输出为: 00000 1 6666 2 0 0 1 1 6 ...
- 第七届蓝桥杯 java组有奖竞猜
第七届蓝桥杯 有奖猜谜 有奖猜谜 小明很喜欢猜谜语. 最近,他被邀请参加了X星球的猜谜活动. 每位选手开始的时候都被发给777个电子币. 规则是:猜对了,手里的电子币数目翻倍, 猜错了,扣除555个电 ...
- 2016年第七届蓝桥杯真题解析JavaC组
相关题目: 2016年第七届蓝桥杯真题解析JavaB组 2016年第七届蓝桥杯真题解析JavaC组 2017年第八届蓝桥杯真题解析JavaB组 2017年第八届蓝桥杯真题解析JavaC组 2018年第 ...
- 蓝桥杯7届c语言 c组答案,第七届蓝桥杯C语言C组-(自己懂的题目)
第七届蓝桥杯C语言C组-(自己懂的题目) 表示刚刚查了成绩,省赛一等奖,有资格去北京了,然后写一下总结, 先来写一下我懂的题目,毕竟我也是菜鸟,听说国赛比预赛难几个等级... 第一题 报纸页数 X星球 ...
最新文章
- 彻底搞懂MySQL分区
- mysql创建数据库选择_mysql创建、选择并使用数据库
- 手机号正则_这20个正则表达式,对你有大帮助,快来Make
- python合并txt文本_Python实现将目录中TXT合并成一个大TXT文件的方法
- java:拷贝文件(夹)
- 判断应用程序在前台还是后台
- Memcached概述
- laravel基本信息
- AngularJS Eclipse——新手入门【翻译+整理】
- Ubuntu下安装uwsgi报错的解决方案
- 50: 加密与解密 、 AIDE入侵检测系统 、 扫描与抓包 、 总结和答疑
- python游戏编程之环境配置
- 2018年总——不忘初心
- 小米手机Home键问题
- 如何完全卸载oracle
- CV_8U CV_32F, and CV_32S
- 计组 - 加法器:进位链
- 小红书商品详情API接口(item_get-获得小红书商品详情接口)
- 赶集网CDC案例-蔡峰:赶集网CDC异构数据同步方案实践-IT168 信息化专区
- 学习Surging笔记(总记)
热门文章
- 豪投10亿!华为放话:3年培养100万AI人才!网友神回应了
- 强推!盘点阿里巴巴 15 款开发者工具 | 程序员硬核评测
- android init.d脚本,◇添加init.d脚本支持教程贴◇
- 华为鸿蒙系统p40,华为鸿蒙OS系统正式亮剑!华为P40再次确认:双打孔+麒麟990+鸿蒙OS...
- c语言 cstring “+”: 运算符不起任何作用;应输入带副作用的运算符_国家计算机二级考试C语言选择题高频考点汇总,干货满满...
- RabbitMQ开机启动 Centos7环境
- Vue + Spring Boot 项目实战(二):使用 CLI 搭建 Vue.js 项目
- ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘192.168.1.165‘ (113)
- 设置线程当天十二点执行_这份JAVA多线程笔记真的是细节满满,几乎全是你工作能用到的干货...
- python 两个数据框合并计算_一文掌握Excel、SQL、Python【数据合并】大法!