题目

  1. /*
  2. 方格填数
  3.  
  4. 如下的10个格子
  5. +--+--+--+
  6. | | | |
  7. +--+--+--+--+
  8. | | | | |
  9. +--+--+--+--+
  10. | | | |
  11. +--+--+--+
  12.  
  13. (如果显示有问题,也可以参看【图1.jpg】)
  14.  
  15. 填入0~9的数字。要求:连续的两个数字不能相邻。
  16. (左右、上下、对角都算相邻)
  17.  
  18. 一共有多少种可能的填数方案?
  19.  
  20. 请填写表示方案数目的整数。
  21. 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。*/

答案

  1. 1580

代码

  1. public class Main {
  2. static int sum = 0 ;
  3. public static void main(String[] args) {
  4. int a[] = {0,1,2,3,4,5,6,7,8,9};
  5. int b[] = new int[10];
  6. String s = "";
  7. f(a,b,0,s);
  8. System.out.println(sum);
  9. }
  10. 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. }

分析

  这又是一道涉及到排列组合的算法题,我用的是比较简单和常见的解法,利用循环递归,开始依次向方格里面填数, 每填一个数都会判断一下这个数是不是符合条件,如果符合条件则递归进去填下一个,如果不符合条件则return,当满足在满足条件的情况下数填完之后(k==10),则sum++,计数加一

  因为判断条件对方格有所依赖,所以想在短时间内写出一个比较完美通用的算法是有点困难的,我们可以把情况细分,使得条件结构更清晰一点,

  再说一个我觉得比较有创意的一点,这也是我最近学到的,就是用一个字符串,让这个字符串也参与递归,就可以巧妙的可以把每次的情况都输出来了,我很喜欢。

  1. private static void f(int[] a,int[] b,int k,String s) {
  2. 11 if(k!=0 && k!=1 && k!=4 && k!=8 ){
  3. 12 if(Math.abs(b[k-1]-b[k-2])==1) return;
  4. 13 }
  5. 14 if(k>=4 && k<=10 && k!=7){
  6. 15 if(Math.abs(b[k-1]-b[k-4])==1) return;
  7. 16 }
  8. 17 if(k>=5 && k<=10){
  9. 18 if(Math.abs(b[k-1]-b[k-5])==1) return;
  10. 19 }
  11. 20 if(k==6 || k==7 || k==9 || k==10){
  12. 21 if(Math.abs(b[k-1]-b[k-6])==1) return;
  13. 22 }
  14. 23
  15. 24 if(k==a.length) {
  16. 25 sum++;
  17. 26 System.out.println(s);
  18. 27 return;
  19. 28 }
  20. 29 for(int i=0;i<a.length;i++){
  21. 30 String ss = s;
  22. 31 if(a[i]==-1) continue;
  23. 32 b[k] = a[i];
  24. 33 ss += a[i];
  25. 34 a[i] = -1;
  26. 35 f(a,b,k+1,ss);
  27. 36 a[i] = b[k];
  28. 37 }
  29. 38
  30. 39
  31. 40 }

第七届蓝桥杯javaB组真题解析-方格填数(第六题)的更多相关文章

  1. 2016年第七届蓝桥杯javaB组 试题 答案 解析

    1.煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100层,共有多少个煤 ...

  2. 第七届蓝桥杯javaB组真题解析-分小组(第四题)

    题目 /* 分小组 9名运动员参加比赛,需要分3组进行预赛. 有哪些分组的方案呢? 我们标记运动员为 A,B,C,... I 下面的程序列出了所有的分组方法. 该程序的正常输出为: ABC DEF G ...

  3. 第七届蓝桥杯javaB组真题解析-凑算式(第三题)

    题目 /* 凑算式 B DEF A + --- + ------- = 10 C GHI (如果显示有问题,可以参见[图1.jpg]) 这个算式中A~I代表1~9的数字,不同的字母代表不同的数字. 比 ...

  4. 第七届蓝桥杯javaB组真题解析-生日蜡烛(第二题)

    题目 /* 生日蜡烛 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填写他开始 ...

  5. 第七届蓝桥杯javaB组真题解析-煤球数目(第一题)

    题目 /* 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100层,共有 ...

  6. 第七届蓝桥杯javaB组真题解析-四平方和(第八题)

    题目 /* 四平方和 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1 ...

  7. 第七届蓝桥杯javaB组真题解析-剪邮票(第七题)

    题目 /* 剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色 ...

  8. 第七届蓝桥杯javaB组真题解析-抽签(第五题)

    题目 /* 抽签 X星球要派出一个5人组成的观察团前往W星. 其中: A国最多可以派出4人. B国最多可以派出2人. C国最多可以派出2人. .... 那么最终派往W星的观察团会有多少种国别的不同组合 ...

  9. 第七届蓝桥杯JavaB组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.煤球数量 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第 ...

随机推荐

  1. 对象析构谈—— delete this 的使用及注意事项

    this对象是必须是用 new操作符分配的(而不是用new[],也不是用placement new,也不是局部对象,也不是global对象): delete this后,不能访问该对象任何的成员变量及 ...

  2. 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文件夹 失效缓存/重新启动

  3. Lc626_换座位

    626. 换座位 SQL架构 小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们相对应的座位 id. 其中纵列的 id 是连续递增的 小美想改变相邻俩学生的座位. ...

  4. js中map和filter方法,以及search方法

    链接:https://blog.51cto.com/11871779/2126561 search方法: 介绍: search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符 ...

  5. HNOI2019 题解

    题目排序不是我做题的顺序也不是试题顺序. 多边形 首先要知道终止态是所有边都指向了 \(n\) 号节点. 那么我们如果每一步都让 \(n\) 的度数 +1 那一定是最优的,显然可以办到. 那么可以从与 ...

  6. vue 实现 多个 数字滚动增加动效

    参考网上其他同学写的 具体出处忘了,不然一定贴上,有问题请联系. 图一是具体js代码:二是设置定时器:三是dom节点需要写ref numberGrow (ele) { this.summaryData ...

  7. django 创建管理员用户

    7.2 create 创建管理员用户: python manage.py run server python manage.py createsuperuser password :123456789 ...

  8. 用Eclipse+Maven+Jetty构建Java Web开发环境(详细笔记)

    (软件环境) 『系统』Windows 10 x64 『JAVA』JDK 1.8.0_91 『Eclipse』 Eclipse-oxygen 『Maven』 apache-maven-3.6.3 『Je ...

  9. spring feign依赖包

    1.feign依赖包 <properties> <java.version>1.8</java.version> <spring-cloud.version& ...

  10. markdown区块

    Markdown 区块 Markdown 区块引用是在段落开头使用 > 符号 ,然后后面紧跟一个空格符号: > 区块引用 > 菜鸟教程 > 学的不仅是技术更是梦想 显示结果如下 ...