zl程序教程

您现在的位置是:首页 >  后端

当前栏目

2020十一届蓝桥杯Java的B组国赛 划水签到打卡

JAVA 蓝桥 2020 打卡 签到
2023-09-27 14:22:13 时间


前言

今天先不更新面试题了,早上4.30起床,5点发车,车上颠簸了3个小时左右,才到了华北理工大学的赛点,还好学校包车,一大堆的人,我本着划水原则,慢慢悠悠走进学校,人家学校是真的大呀!可惜这次没机会溜达,9点开始划水划到中午1点才出来,去食堂吃了个饭,溜达了一会就坐上回学校的车了,将近有7、8个小时在路上颠簸了。我就说几个有印象的题目吧,毕竟其他也不会,也肝不出来。


一、1-2020多少个含2的年份(常规打卡)

这个一眼看出来就是签到题,做完这道题我的任务其实就已经完成了(哈哈哈哈!),就很简单,蓝桥杯交流群里还有Excel拉出来的,我还是正规一点整个代码吧!如下:

public class Main { //A题 
    public static void main(String[] args) {
        int count = 0;
        for(int i=1;i<2020;i++){
            int tmp = i;
            while (tmp > 0){
                if(tmp%10 == 2){
                    count++;
                    break;
                }
                tmp/= 10;
            }
        }
        System.out.println(count);
    }
}

答案是:563

二、小蓝的玩具蛇

做这个题的原因是因为其他的实在是不会或者没思路呀,这个题很像我当初发的那两篇博客 老鼠迷宫-dfs老鼠迷宫-bfs 一个是深度寻路算法,一个是广度寻路算法,其实就是广度和深度遍历,当初数据结构这门课有个单独的课设,因为选题的缘故,自己选了老鼠游戏这个课题,然后课设一发不可收拾,虽然算法和数据结构没学好,但是这个课设却让我深刻的理解了广度和深度遍历这两个算法,果然兴趣是最大的动力,当时自己硬生生的百度学会吃透了这两个遍历算法,现在回望过去,当初的代码逻辑虽然好设计,但是也是自己的第一个大项目,所以写的很乱,感觉代码的参数设计的真烂,写代码时间越久越觉得自己以前写的好low,不扯了,这个题主要就是一个16节长的玩具蛇,放到一个4X4的盒子中,蛇身可以转90度,就是能拐一下,到代码里就是有四个方向可选,然后一直放到满算一次,代码跑起来挺快的,因为二维数组还比较小,最后统计一下共有多少种放置方法。

/**
 * Created by ZERO丶X on 2020/11/14
 */
public class Main {
    public static int[][] map = new int[4][4];
    public static int ans = 0;
    public static void main(String[] args) {
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                map[i][j] = 1;
                dfs(0,i,j);
                map[i][j] = 0;
            }
        }
        System.out.println(ans);
    }
	//深度递归放置蛇蛇
    public static void dfs(int deep,int i,int j){
        if(deep == 15){
            ans++;
            return;
        }
        if(move(0,i,j)){
            map[i-1][j] = 1;
            dfs(deep+1,i-1,j);
            map[i-1][j] = 0;
        }
        if(move(1,i,j)){
            map[i+1][j] = 1;
            dfs(deep+1,i+1,j);
            map[i+1][j] = 0;
        }
        if(move(2,i,j)){
            map[i][j-1] = 1;
            dfs(deep+1,i,j-1);
            map[i][j-1] = 0;
        }
        if(move(3,i,j)){
            map[i][j+1] = 1;
            dfs(deep+1,i,j+1);
            map[i][j+1] = 0;
        }
    }
	//移动判断函数
    public static boolean move(int step,int i,int j){
        if(step == 0 ){ //上
            if(i<=0 || map[i-1][j] == 1) return false;
        }else if(step == 1){ //下
            if(i>=3 || map[i+1][j] == 1) return false;
        }else if(step == 2){ //左
            if(j<=0 || map[i][j-1] == 1) return false;
        }else if(step == 3){ //右
            if(j>=3 || map[i][j+1] == 1) return false;
        }
        return true;
    }
}

答案是:552

三、蓝肽

问题简化一下就是两个字符串代表蛋蓝质,里面的子序列是蓝肽
LanQiaoBei
LanXiaoQiao
然后找出一个最长子序列,其中LanQiao就是他们的最长子序列,所以返回2,两个蛋蓝质的子序列顺序一定要一致,然后找出来最长的长度返回。
这道题我只有大概的思路也不知道写的对不对,就是把蛋蓝质分割成蓝肽,【Lan,Qia,Bei】和【Lan,Xiao,Qiao】,两个数组,然后循环去获取两个数组的最长子串,拿到最长长度后直接返回就行了。反正思路就是这么个大概了,至于对错个人不敢保证。我感觉也不太对,毕竟测试用例比这个大多了,所以我这个方法不太现实,也能混几个用例换换分吧,蓝桥杯“老塞棍”了,一句话“混”就是完事了。

四、画廊

画廊这个题还是蛮有意思的,可以当成一个坐标系吧,输入是左右墙上的画的数量和画廊长度宽度,然后第二行和第三行输入画廊左右的画的距离,画家的起点是画廊的开始中间,结束点是另一边的中间,如下图所示。最后算出画家调整所有画所需走过的最短距离。给的用例如下:
3 3 10 2
1 3 8
2 4 6
地图
大概可以画出这样的图吧,把左下角记为坐标原点,然后把起始和结束标记为两个坐标点,走廊的画也标记成点,就可以算了。起始点start(1,0)、结束点end(1,10),然后走廊的画代表的点1(0,1)、2(2,2)、3(0,3)、4(2,4)、6(2,6)、8(0,8),然后依次两点距离是Math.sqrt(2)、2、Math.sqrt(5)、2、2、Math.sqrt(8)、Math.sqrt(5),最后加起来好像是14.71吧,这个就是测试用例的算法。然后我想到的算法是固定开始点start和结束点end,中间的点位换算成一个List列表,然后所有点是一个数组只包含x和y的坐标点,每次计算的时候根据上一个点和当前点进行两点距离计算,然后每个点计算后的距离只记录最小的,最后选定最小的距离点,同时在List中删除这个点,然后再在这个点上进行下一步,和剩余的点进行距离计算,重复同样的过程,每次都是最小距离,直到List集合中只剩一个点,然后计算上一个点与剩下的点的距离加到总距离中,再把剩下的这个点和end点计算,再加到总距离中,就能求到最短距离了。目前就考虑到了这么多,更复杂的没有考虑的,也可能有误,希望有大佬能指点一下,因为每次计算的都是两个点之间的最小距离,然后将这些求和就是最小路程,也不知道对不对,但是应该也能混点分数了,不知道到时候成绩出来啥结果。


总结

终于到了总结时刻了,从周六写到周日可太难了,每天逼自己出篇博客也算不上讨厌吧,感觉写的时候还是挺有意思的,总结一下过往,也算是笔记吧,感觉学过的东西做了笔记能更加加深印象,光是回忆今天做过的算法题也用了很大一部分时间,更何况还有一些别的日常任务,国赛10道题里面,也就水了这4道题,不知道能对几个。不想熬夜还是早点睡吧,也没啥可说的,算法这个东西,有点天赋加上努力刷题应该也能到达一个基本水平,每天刷一题也不错,我自己刷题一般是在力扣上刷题,有个每日一题可以挑战一下,建议从简单题开始刷起,然后中等和困难,刷的时候按标签分类刷就能尽快掌握一种类型,算法这个主要练程序员逻辑能力,反正多做一点没坏处。加油吧!上学人!!!

—— 2020.11.15 0:50 熬夜伤身,尽量别熬夜,一个大四菜鸟的忠告…

今日份励志名言:

“行有不得,反求诸己。”
——(语出 孟子《孟子·离娄上》