算法笔记_202:第三届蓝桥杯软件类决赛真题(Java高职)
目录
前言:以下代码仅供参考,若有错误欢迎指正哦~
1 填算式
【结果填空】 (满分11分)
    看这个算式:
    ☆☆☆ + ☆☆☆ = ☆☆☆
    如果每个五角星代表 1 ~ 9 的不同的数字。
    这个算式有多少种可能的正确填写方法?
    173 + 286 = 459
    295 + 173 = 468
    173 + 295 = 468
    183 + 492 = 675
    以上都是正确的填写法!
    注意:
    111 + 222 = 333 是错误的填写法!
    因为每个数字必须是不同的!
    也就是说:1~9中的所有数字,每个必须出现且仅出现一次!
    注意:
    不包括数字“0”!
    注意:
    满足加法交换率的式子算两种不同的答案。
    所以答案肯定是个偶数!
    注意:
    只要求计算不同的填法的数目
    不要求列出所有填写法
    更不要求填写源代码!
    答案不要写在这里,请写在“解答.txt”中!
336
 public class Main {
     public static int count = 0;
     public static void swap(int[] A, int i, int j) {
         int temp = A[i];
         A[i] = A[j];
         A[j] = temp;
     }
     public static void dfs(int[] A, int step) {
         if(step == A.length) {
             int a = A[0]*100 + A[1]*10 + A[2];
             int b = A[3]*100 + A[4]*10 + A[5];
             int c = A[6]*100 + A[7]*10 + A[8];
             if(a + b == c)
                 count++;
             return;
         } else {
             for(int i = step;i < A.length;i++) {
                 swap(A, i, step);
                 dfs(A, step + 1);
                 swap(A, i, step);
             }
         }
     }
     public static void main(String[] args) {
         int[] A = {1,2,3,4,5,6,7,8,9};
         dfs(A, 0);
         System.out.println(count);
     }
 }
2 提取子串
【代码填空】(满分16分)
    串“abcba”以字母“c”为中心左右对称;串“abba” 是另一种模式的左右对称。这两种情况我们都称这个串是镜像串。特别地,只含有1个字母的串,可以看成是第一种模式的镜像串。 
    一个串可以含有许多镜像子串。我们的目标是求一个串的最大镜像子串(最长的镜像子串),如果有多个最大镜像子串,对称中心靠左的优先选中。例如:“abcdeefghhgfeiieje444k444lmn”的最大镜像子串是:“efghhgfe”
    下面的静态方法实现了该功能,请仔细阅读并分析代码,填写空白处的代码,使得程序的逻辑合理,结果正确。
// 求最大(长度最大)镜像对称子串
public static String getMaxMirrorString(String s)
{
    String max_s = "";  // 所求的最大对称子串
    for(int i=0; i<s.length(); i++)
    {
        // 第一种对称模式
        int step = 1;
        try{
            for(;;)
            {
                if(s.charAt(i-step) != s.charAt(i+step)) break;
                step++;
            }
        }catch(Exception e){}
        String s1 = s.substring(_____________________________);     // 填空1
        // 第二种对称模式
        step = 0;
        try{
            for(;;)
            {
                if(_________________________________) break;    // 填空2
                step++;
            }
        }catch(Exception e){}
        String s2 = s.substring(i-step+1,i+step+1);
        if(s1.length() > max_s.length()) max_s = s1;
        if(s2.length() > max_s.length()) max_s = s2;
    }
    return max_s;
}
【注意】
    只填写缺少的部分,不要抄写已有的代码。
    所填写代码不超过1条语句(句中不会含有分号)
    所填代码长度不超过256个字符。
    答案写在“解答.txt”中,不要写在这里!
i-step+1, i+step
s.charAt(i-step) != s.charAt(i+step+1)
3 机器人行走
【编程题】(满分18分)
    某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单,只有3种:左转(记为L),右转(记为R),向前走若干厘米(直接记数字)。
    例如,我们可以对小车输入如下的指令:
    15L10R5LRR10R20
    则,小车先直行15厘米,左转,再走10厘米,再右转,...
    不难看出,对于此指令串,小车又回到了出发地。
    你的任务是:编写程序,由用户输入指令,程序输出每条指令执行后小车位置与指令执行前小车位置的直线距离。
【输入、输出格式要求】
    用户先输入一个整数n(n<100),表示接下来将有n条指令。
    接下来输入n条指令。每条指令只由L、R和数字组成(数字是0~100之间的整数)
    每条指令的长度不超过256个字符。
    程序则输出n行结果。
    每条结果表示小车执行相应的指令前后位置的直线距离。要求四舍五入到小数后2位。
    例如:用户输入:
5
L100R50R10
3LLL5RR4L12
LL
100R
5L5L5L5
    则程序输出:
102.96
9.06
0.00
100.00
0.00
【注意】
    请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!
    请把所有类写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。
    相关的工程文件不要拷入。
    请不要使用package语句。
    源程序中只能出现JDK1.5中允许的语法或调用。不能使用1.6或更高版本。 
 import java.util.Scanner;
 public class Main {
     public static String Left = "ULDR";
     public static String Right = "URDL";
     public double getResult(String A) {
         double r = 0, x = 0, y = 0;
         char way = 'U';
         for(int i = 0;i < A.length();i++) {
             int start = i;
             if(A.charAt(start) >= '0' && A.charAt(start) <= '9') {
                 while(start < A.length() && A.charAt(start) >= '0' && A.charAt(start) <= '9')
                     start++;
                 int num = Integer.valueOf(A.substring(i, start));
                 if(way == 'U')
                     y += num;
                 else if(way == 'L')
                     x -= num;
                 else if(way == 'D')
                     y -= num;
                 else if(way == 'R')
                     x += num;
                 i = start - 1;
             } else {
                 char temp = A.charAt(i);
                 if(temp == 'L') {
                     int p = Left.indexOf(way+"");
                     p = (p + 1) % 4;
                     way = Left.charAt(p);
                 } else if(temp == 'R') {
                     int p = Right.indexOf(way+"");
                     p = (p + 1) % 4;
                     way = Right.charAt(p);
                 }
             }
         }
         r = Math.sqrt(x*x + y*y);
         return r;
     }
     public static void main(String[] args) {
         Main test = new Main();
         Scanner in = new Scanner(System.in);
         int n = in.nextInt();
         double[] result = new double[n];
         for(int i = 0;i < n;i++) {
             String A = in.next();
             result[i] = test.getResult(A);
         }
         for(int i = 0;i < n;i++) {
             System.out.printf("%.2f", result[i]);
             System.out.println();
         }
     }
 }
4 地址格式转换
【编程题】(满分21分)
    Excel是最常用的办公软件。每个单元格都有唯一的地址表示。比如:第12行第4列表示为:“D12”,第5行第255列表示为“IU5”。
    事实上,Excel提供了两种地址表示方法,还有一种表示法叫做RC格式地址。 第12行第4列表示为:“R12C4”,第5行第255列表示为“R5C255”。
    你的任务是:编写程序,实现从RC地址格式到常规地址格式的转换。
【输入、输出格式要求】
    用户先输入一个整数n(n<100),表示接下来有n行输入数据。
    接着输入的n行数据是RC格式的Excel单元格地址表示法。
    程序则输出n行数据,每行是转换后的常规地址表示法。
    例如:用户输入:
2
R12C4
R5C255
    则程序应该输出:
D12
IU5
【注意】
    请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!
    请把所有类写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。
    相关的工程文件不要拷入。
    请不要使用package语句。
    源程序中只能出现JDK1.5中允许的语法或调用。不能使用1.6或更高版本。 
import java.util.ArrayList;
import java.util.Scanner; public class Main {
public static String Position = "0ABCDEFGHIJKLMNOPQRSTUVWXYZ"; public String getResult(String A) {
String r = "";
ArrayList<Integer> list = new ArrayList<Integer>();
int a = 0, b = 0;
int m = A.indexOf('C');
a = Integer.valueOf(A.substring(1, m));
b = Integer.valueOf(A.substring(m + 1));
while(b > 0) {
list.add(b % 26);
b = b / 26;
}
for(int i = list.size() - 1;i >= 0;i--)
r = r + Position.charAt(list.get(i));
r = r + a;
return r;
} public static void main(String[] args) throws Exception {
Main test = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
String[] result = new String[n];
for(int i = 0;i < n;i++) {
String A = in.next();
result[i] = test.getResult(A);
}
for(int i = 0;i < n;i++)
System.out.println(result[i]);
}
}
5 排日程
【编程题】(满分34分)
    某保密单位机要人员 A,B,C,D,E 每周需要工作5天,休息2天。
    上级要求每个人每周的工作日和休息日安排必须是固定的,不能在周间变更。
    此外,由于工作需要,还有如下要求:
    1. 所有人的连续工作日不能多于3天(注意:周日连到下周一也是连续)。
    2. 一周中,至少有3天所有人都是上班的。
    3. 任何一天,必须保证 A B C D 中至少有2人上班。
    4. B D E 在周日那天必须休息。
    5. A E 周三必须上班。
    6. A C 一周中必须至少有4天能见面(即同时上班)。
    你的任务是:编写程序,列出ABCDE所有可能的一周排班情况。工作日记为1,休息日记为0
    A B C D E 每人占用1行记录,从星期一开始。
【输入、输出格式要求】
    程序没有输入,要求输出所有可能的方案。
    每个方案是7x5的矩阵。只有1和0组成。        
    矩阵中的列表示星期几,从星期一开始。
    矩阵的行分别表示A,B,C,D,E的作息时间表。
    多个矩阵间用空行分隔开。
    例如,如下的矩阵就是一个合格的解。请编程输出所有解(多个解的前后顺序不重要)。
0110111
1101110
0110111
1101110
1110110
【注意】
    请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!
    请把所有类写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。
    相关的工程文件不要拷入。
    请不要使用package语句。
    源程序中只能出现JDK1.5中允许的语法或调用。不能使用1.6或更高版本。 
 import java.util.ArrayList;
 public class Main {
     public static int[] S = {0, 1};
     public static ArrayList<String> list = new ArrayList<String>();
     public static ArrayList<String> result = new ArrayList<String>();
     public boolean check(int[] A) {
         int count = 0;
         for(int i = 0;i < 7;i++) {
             if(A[i] == 1)
                 count++;
             if(A[i % 7] == 1 && A[(i+1) % 7] == 1 && A[(i+2) % 7] == 1
                     && A[(i+3) % 7] == 1)
                 return false;
         }
         if(count == 5)
             return true;
         return false;
     }
     public void dfs(int[] A, int step) {
         if(step == A.length) {
             if(check(A)) {
                 StringBuilder s = new StringBuilder("");
                 for(int i = 0;i < A.length;i++)
                     s.append(A[i]);
                 if(!list.contains(s))
                     list.add(s.toString());
             }
             return;
         } else {
             for(int i = 0;i < 2;i++) {
                 A[step] = S[i];
                 dfs(A, step + 1);
                 A[step] = -1;
             }
         }
     }
     public boolean check1(String[] arrayA, int step) {
         if(step >= 0) {
             if(arrayA[0].charAt(2) != '1')
                 return false;
         }
         if(step >= 1) {
             if(arrayA[1].charAt(6) != '0')
                 return false;
         }
         if(step >= 2) {
             int count = 0;
             for(int i = 0;i < arrayA[0].length();i++) {
                 if(arrayA[0].charAt(i) == arrayA[2].charAt(i) &&
                         arrayA[0].charAt(i) == '1')
                     count++;
             }
             if(count < 4)
                 return false;
         }
         if(step >= 3) {
             if(arrayA[3].charAt(6) != '0')
                 return false;
             for(int i = 0;i < arrayA[0].length();i++) {
                 int count = 0;
                 if(arrayA[0].charAt(i) == '1')
                     count++;
                 if(arrayA[1].charAt(i) == '1')
                     count++;
                 if(arrayA[2].charAt(i) == '1')
                     count++;
                 if(arrayA[3].charAt(i) == '1')
                     count++;
                 if(count < 2)
                     return false;
             }
         }
         if(step >= 4) {
             if(arrayA[4].charAt(6) != '0' || arrayA[4].charAt(2) != '1')
                 return false;
             int count = 0;
             for(int i = 0;i < arrayA[0].length();i++) {
                 if(arrayA[0].charAt(i) == '1' && arrayA[1].charAt(i)
                         == '1' && arrayA[2].charAt(i) == '1' &&
                         arrayA[3].charAt(i) == '1' && arrayA[4].charAt(i) == '1')
                     count++;
             }
             if(count < 3)
                 return false;
         }
         return true;
     }
     public void dfsResult(String[] arrayA, int step) {
         if(step == 5) {
             String s = "";
             for(int i = 0;i < arrayA.length;i++) {
                 s = s + arrayA[i] + "\n";
             }
             if(!result.contains(s))
                 result.add(s);
             return;
         } else {
             for(int i = 0;i < list.size();i++) {
                 arrayA[step] = list.get(i);
                 if(check1(arrayA, step)) {
                     dfsResult(arrayA, step + 1);
                     arrayA[step] = "";
                 } else {
                     continue;
                 }
             }
         }
     }
     public void getResult() {
         int[] A = {-1,-1,-1,-1,-1,-1,-1};
         dfs(A, 0);
         String[] arrayA = new String[5];
         dfsResult(arrayA, 0);
         for(int i = 0;i < result.size();i++)
             System.out.println(result.get(i));
     }
     public static void main(String[] args) {
         Main test = new Main();
         test.getResult();
     }
 }
算法笔记_202:第三届蓝桥杯软件类决赛真题(Java高职)的更多相关文章
- 算法笔记_201:第三届蓝桥杯软件类决赛真题(Java本科)
		目录 1 数量周期 2 提取子串 3 源码变换 4 古代赌局 5 火柴游戏 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 数量周期 [结果填空](满分9分) 复杂现象背后的推动力,可能是极其简 ... 
- 算法笔记_206:第五届蓝桥杯软件类决赛真题(Java语言A组)
		目录 1 海盗分金币 2 六角幻方 3 格子放鸡蛋 4 排列序数 5 幂一矩阵 6 供水设施 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 海盗分金币 有5个海盗,相约进行一次帆船比赛. 比 ... 
- 算法笔记_200:第三届蓝桥杯软件类决赛真题(C语言本科)
		目录 1 星期几 2 数据压缩 3 拼音字母 4 DNA比对 5 方块填数 前言:以下代码部分仅供参考,若有不当之处,还望路过同学指出哦~ 1 星期几 1949年的国庆节(10月1日)是星期六. ... 
- 算法笔记_204:第四届蓝桥杯软件类决赛真题(Java语言C组)
		目录 1 好好学习 2 埃及分数 3 金蝉素数 4 横向打印二叉树 5 危险系数 6 公式求值 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 好好学习 汤姆跟爷爷来中国旅游.一天,他帮助中国的 ... 
- 算法笔记_205:第五届蓝桥杯软件类决赛真题(C语言B组)
		目录 1 年龄巧合 2 出栈次序 3 信号匹配 4 生物芯片 5 Log大侠 6 殖民地 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 年龄巧合 小明和他的表弟一起去看电影,有人问他们的年龄. ... 
- 算法笔记_203:第四届蓝桥杯软件类决赛真题(C语言B组)
		目录 1 猜灯谜 2 连续奇数和 3 空白格式化 4 高僧斗法 5 格子刷油漆 6 农场阳光 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 猜灯谜 标题:猜灯谜 A 村的元宵节灯会上有一迷题: ... 
- 算法笔记_208:第六届蓝桥杯软件类决赛真题(Java语言A组)
		目录 1 胡同门牌号 2 四阶幻方 3 显示二叉树 4 穿越雷区 5 切开字符串 6 铺瓷砖 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 胡同门牌号 标题:胡同门牌号 小明家住在一条胡同里. ... 
- 算法笔记_210:第六届蓝桥杯软件类决赛真题(Java语言C组)
		目录 1 机器人数目 2 生成回文数 3 空心菱形 4 奇怪的数列 5 密文搜索 6 居民集会 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 机器人数目 标题:机器人数目 少年宫新近邮购了小机器人 ... 
- 算法笔记_212:第七届蓝桥杯软件类决赛真题(Java语言B组)
		目录 1 愤怒小鸟 2 反幻方 3 打靶 4 路径之谜 5 碱基 6 圆圈舞 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 愤怒小鸟 愤怒小鸟 X星球愤怒的小鸟喜欢撞火车! 一根平直的铁轨上两火车 ... 
随机推荐
- python测试开发django-31.admin后台一对多操作ForeignKey
			前言 平常的网页上有很多一对多的场景,比如填写银行卡信息的时候,会从银行列表下拉框选择对应的银行信息.一般会建两张表,一张表放银行的信息,一张表放银行卡信息. 每个银行可以对应多个银行卡,每个银行卡只 ... 
- 霍夫曼编码(Huffman Coding)
			霍夫曼编码(Huffman Coding)是一种编码方法,霍夫曼编码是可变字长编码(VLC)的一种. 霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符 ... 
- HTML5+Java(Spring下) 拍照上传图片
			使用支持html5的浏览器,找个有摄像头,再建一个文件接收base64字串的图片然后保存就哦了 <html> <head runat="ReYo-Server"& ... 
- 3分钟搞定SpringBoot+Mybatis+druid多数据源和分布式事务
			文章来自: https://blog.csdn.net/qq_29242877/article/details/79033287 在一些复杂的应用开发中,一个应用可能会涉及到连接多个数据源,所谓多数据 ... 
- MySQL 锁模式
			InnoDB implements standard row-level locking where there are two types of locks, shared (S) locks an ... 
- frp错误处理:login to server failed: authorization failed
			frp使用过程中会出现各种错误信息,有些朋友不太清楚,打算记录一些常见的错误返回代码,这里介绍一下frpc客户端[W] [control.go:111] login to server failed: ... 
- FMX.Controls单元 中图形矩阵变换
			procedure TControl.DoMatrixChanged(Sender: TObject);var TranslateMatrix, ScaleMatrix, RotMatrix: TMa ... 
- background: inherit制作倒影、单行居中两行居左超过两行省略
			1.background: inherit;制作倒影 方法很多,但是我们当然要寻找最快最便捷的方法,至少得是无论图片怎么变化,div 大小怎么变化,我们都不用去改我们的代码. -webkit-box- ... 
- WINDOWS 逻辑坐标 设备坐标 屏幕坐标 客户区坐标
			转自:http://blog.csdn.net/lovesunshine2008/article/details/4048158 设置坐标映射 (1)Windows坐标系统 Windows坐标系 ... 
- SSAS知识回放之订单数据分析
			1:目标 基于已经做好的DW,利用SSAS实现一个多维数据模型的创建,通过浏览可以简单的实现订单数据的分析 2:步骤 2.1:添加数据源 如下图所示,创建一个数据仓库层的数据源连接 2.2:添加数据源 ... 
