第七届蓝桥杯javaB组真题解析-方格填数(第六题)
题目
- /*
- 方格填数
- 如下的10个格子
- +--+--+--+
- | | | |
- +--+--+--+--+
- | | | | |
- +--+--+--+--+
- | | | |
- +--+--+--+
- (如果显示有问题,也可以参看【图1.jpg】)
- 填入0~9的数字。要求:连续的两个数字不能相邻。
- (左右、上下、对角都算相邻)
- 一共有多少种可能的填数方案?
- 请填写表示方案数目的整数。
- 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。*/
答案
- 1580
代码
- public class Main {
- static int sum = 0 ;
- public static void main(String[] args) {
- int a[] = {0,1,2,3,4,5,6,7,8,9};
- int b[] = new int[10];
- String s = "";
- f(a,b,0,s);
- System.out.println(sum);
- }
- private static void f(int[] a,int[] b,int k,String s) {
- if(k!=0 && k!=1 && k!=4 && k!=8 ){
- if(Math.abs(b[k-1]-b[k-2])==1) return;
- }
- if(k>=4 && k<=10 && k!=7){
- if(Math.abs(b[k-1]-b[k-4])==1) return;
- }
- if(k>=5 && k<=10){
- if(Math.abs(b[k-1]-b[k-5])==1) return;
- }
- if(k==6 || k==7 || k==9 || k==10){
- if(Math.abs(b[k-1]-b[k-6])==1) return;
- }
- if(k==a.length) {
- sum++;
- System.out.println(s);
- return;
- }
- for(int i=0;i<a.length;i++){
- String ss = s;
- if(a[i]==-1) continue;
- b[k] = a[i];
- ss += a[i];
- a[i] = -1;
- f(a,b,k+1,ss);
- a[i] = b[k];
- }
- }
- }
分析
这又是一道涉及到排列组合的算法题,我用的是比较简单和常见的解法,利用循环递归,开始依次向方格里面填数, 每填一个数都会判断一下这个数是不是符合条件,如果符合条件则递归进去填下一个,如果不符合条件则return,当满足在满足条件的情况下数填完之后(k==10),则sum++,计数加一
因为判断条件对方格有所依赖,所以想在短时间内写出一个比较完美通用的算法是有点困难的,我们可以把情况细分,使得条件结构更清晰一点,
再说一个我觉得比较有创意的一点,这也是我最近学到的,就是用一个字符串,让这个字符串也参与递归,就可以巧妙的可以把每次的情况都输出来了,我很喜欢。
- private static void f(int[] a,int[] b,int k,String s) {
- 11 if(k!=0 && k!=1 && k!=4 && k!=8 ){
- 12 if(Math.abs(b[k-1]-b[k-2])==1) return;
- 13 }
- 14 if(k>=4 && k<=10 && k!=7){
- 15 if(Math.abs(b[k-1]-b[k-4])==1) return;
- 16 }
- 17 if(k>=5 && k<=10){
- 18 if(Math.abs(b[k-1]-b[k-5])==1) return;
- 19 }
- 20 if(k==6 || k==7 || k==9 || k==10){
- 21 if(Math.abs(b[k-1]-b[k-6])==1) return;
- 22 }
- 23
- 24 if(k==a.length) {
- 25 sum++;
- 26 System.out.println(s);
- 27 return;
- 28 }
- 29 for(int i=0;i<a.length;i++){
- 30 String ss = s;
- 31 if(a[i]==-1) continue;
- 32 b[k] = a[i];
- 33 ss += a[i];
- 34 a[i] = -1;
- 35 f(a,b,k+1,ss);
- 36 a[i] = b[k];
- 37 }
- 38
- 39
- 40 }
第七届蓝桥杯javaB组真题解析-方格填数(第六题)的更多相关文章
- 2016年第七届蓝桥杯javaB组 试题 答案 解析
1.煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100层,共有多少个煤 ...
- 第七届蓝桥杯javaB组真题解析-分小组(第四题)
题目 /* 分小组 9名运动员参加比赛,需要分3组进行预赛. 有哪些分组的方案呢? 我们标记运动员为 A,B,C,... I 下面的程序列出了所有的分组方法. 该程序的正常输出为: ABC DEF G ...
- 第七届蓝桥杯javaB组真题解析-凑算式(第三题)
题目 /* 凑算式 B DEF A + --- + ------- = 10 C GHI (如果显示有问题,可以参见[图1.jpg]) 这个算式中A~I代表1~9的数字,不同的字母代表不同的数字. 比 ...
- 第七届蓝桥杯javaB组真题解析-生日蜡烛(第二题)
题目 /* 生日蜡烛 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填写他开始 ...
- 第七届蓝桥杯javaB组真题解析-煤球数目(第一题)
题目 /* 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100层,共有 ...
- 第七届蓝桥杯javaB组真题解析-四平方和(第八题)
题目 /* 四平方和 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1 ...
- 第七届蓝桥杯javaB组真题解析-剪邮票(第七题)
题目 /* 剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色 ...
- 第七届蓝桥杯javaB组真题解析-抽签(第五题)
题目 /* 抽签 X星球要派出一个5人组成的观察团前往W星. 其中: A国最多可以派出4人. B国最多可以派出2人. C国最多可以派出2人. .... 那么最终派往W星的观察团会有多少种国别的不同组合 ...
- 第七届蓝桥杯JavaB组省赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.煤球数量 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第 ...
随机推荐
- 对象析构谈—— delete this 的使用及注意事项
this对象是必须是用 new操作符分配的(而不是用new[],也不是用placement new,也不是局部对象,也不是global对象): delete this后,不能访问该对象任何的成员变量及 ...
- AS报错:Class kotlin.reflect.jvm.internal.FunctionCaller$FieldSetter can not access a member of class com.android.build.gradle.tasks.ManifestProcessorTask with modifiers "private"
删除所有.gradle文件夹 失效缓存/重新启动
- Lc626_换座位
626. 换座位 SQL架构 小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们相对应的座位 id. 其中纵列的 id 是连续递增的 小美想改变相邻俩学生的座位. ...
- js中map和filter方法,以及search方法
链接:https://blog.51cto.com/11871779/2126561 search方法: 介绍: search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符 ...
- HNOI2019 题解
题目排序不是我做题的顺序也不是试题顺序. 多边形 首先要知道终止态是所有边都指向了 \(n\) 号节点. 那么我们如果每一步都让 \(n\) 的度数 +1 那一定是最优的,显然可以办到. 那么可以从与 ...
- vue 实现 多个 数字滚动增加动效
参考网上其他同学写的 具体出处忘了,不然一定贴上,有问题请联系. 图一是具体js代码:二是设置定时器:三是dom节点需要写ref numberGrow (ele) { this.summaryData ...
- django 创建管理员用户
7.2 create 创建管理员用户: python manage.py run server python manage.py createsuperuser password :123456789 ...
- 用Eclipse+Maven+Jetty构建Java Web开发环境(详细笔记)
(软件环境) 『系统』Windows 10 x64 『JAVA』JDK 1.8.0_91 『Eclipse』 Eclipse-oxygen 『Maven』 apache-maven-3.6.3 『Je ...
- spring feign依赖包
1.feign依赖包 <properties> <java.version>1.8</java.version> <spring-cloud.version& ...
- markdown区块
Markdown 区块 Markdown 区块引用是在段落开头使用 > 符号 ,然后后面紧跟一个空格符号: > 区块引用 > 菜鸟教程 > 学的不仅是技术更是梦想 显示结果如下 ...