度小满校招后端研发第2批编程题Java题解

1、坚强的小昆虫

由于新冠肺炎疫情的爆发,小明养在宿舍的小昆虫已经很久很久都没有人管了。小昆虫已经饿的不行了,必须出来找东西吃,可是出来之后需 要走出一个迷宫。小昆虫每次可以朝上、下、左、右四个方向之一走一步,且只要走出任意一条边界线即可逃出迷宫。这只小昆虫曾感染过X星 的一种奇异病毒,目前还没有发现任何副作用,但是却拥有了一项特异功能------破坏障碍物。 假设小昆虫在一个NM的迷宫中,"@"代表小昆虫的初始位置,"."代表可以通过的空地,""代表可以破坏的障碍物,"#"代表不可破坏的障碍 物。请问小昆虫最少需要使用多少次特异功能才可以逃出迷宫?

这是一道迷宫变式题:关键点在于可以破坏障碍物,因此需要分情况DFS

java 复制代码
import java.util.*;
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    static int[][] dir = {{1,0}, {-1,0}, {0,1}, {0,-1}};
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int T = in.nextInt();
        while (T > 0) {
            T--;
            int n = in.nextInt();
            int m = in.nextInt();
            char[][] mat = new char[n][m];
            boolean f = true;
            int sx = 0, sy = 0;
            for(int i = 0; i < n; i++){
            // Java无法一个一个字符读入,直接读取一整行再转为数组
                mat[i] = in.next().toCharArray();
                for(int j = 0; f && j < m; j++){
                    if(mat[i][j] == '@'){
                        sx = i; sy = j;
                        f = false;
                    }
                }
            }
            // DFS
            // 标记是否访问过
            boolean[][] vis = new boolean[n][m];
            // 记录所有的结果
            List<Integer> ans = new ArrayList<>();
            dfs(sx, sy, 0, vis, ans, mat);
            Collections.sort(ans);
            System.out.println(ans.get(0));
        }
    }
    private static void dfs(int sx, int sy, int cnt, boolean[][] vis, List<Integer> ans, char[][] mat){
        vis[sx][sy] = true; // 已访问
        int f = 0;
        for(int[] x : dir){
            int dx = sx + x[0];
            int dy = sy + x[1];
            if(dx < 0 || dx >= vis.length || dy < 0 || dy >= vis[0].length){
                // 达到边界
                ans.add(cnt);
                return;
            }
            // 如果当前点四周都是#, 则一定不能走出去
            if(mat[dx][dy] == '#')f++;
            if(!vis[dx][dy]){
            // 分情况
                if(mat[dx][dy] == '.'){
                    dfs(dx, dy, cnt, vis, ans, mat);
                }else if(mat[dx][dy] == '*'){
                    dfs(dx, dy, cnt+1, vis, ans, mat);
                }
        }
      }
      if(f == 4){
        ans.add(-1); // 走不出去
        return;
      }
    }
}
2、涂色

小A正在学画画,现在,线稿已经画好了,只剩下涂色部分了。但是小A发现,他的颜料不够了。每一块颜料能涂一个色块,每一个色块的颜色 是事先决定好了的。 由于颜料不够,小A只能尽其所能来涂色。如果一个色块没有了颜料,就不能涂色。现在,给你画中需要的色块颜色,和小A现在手上有的颜 料,请你计算小A能涂多少个色块。

使用Hash思想:将字符串s1转为长度为26的数组,对每个字符进行次数统计,然后遍历s2,计数不能涂色的数量cnt,最后结果就是字符串长度减去cnt

java 复制代码
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s1 = in.next();
        String s2 = in.next();
        int[] a1 = new int[26];
        for(char c : s1.toCharArray()){
            a1[c-'A']++;
        }
        int cnt = 0;
        for(char c : s2.toCharArray()){
            if(a1[c - 'A'] > 0){
                a1[c - 'A']--;
            }else{
                cnt++;
            }
        }
        System.out.println(s1.length() - cnt);
    }
}
相关推荐
caoerzhong8 小时前
仓库数字化成熟度分级:JeeWMS 开源 Java 仓库管理系统如何支撑从可见到自治的四级跃迁
java·开源
可乐鸡翅yeah_8 小时前
video.js 集成 hls.js 开发 M3U8 播放器,新手高频踩坑
开发语言·前端·javascript·后端·ecmascript·m3u8·音视频在线播放
MayBaymax8 小时前
RocketMQ 存储机制
java·rocketmq
小鹿的周先生8 小时前
第11章-Structured-Output
开发语言·人工智能·python
程序猿_极客8 小时前
【免费】分享一套优质的基于SpringBoot的服装商城管理系统的设计与实现(带可视化图表、协同过滤功能),源码+文档+视频详解(讲解)
java·spring boot·后端·服装商城管理系统
泡海椒8 小时前
JQuick-Excel 实战:FORMAT 管理日期与数字的 Excel 显示
开发语言·python·excel
用户3721574261359 小时前
Java 查找并高亮 Word 文字:精确查找及正则表达式模糊查找
java
zyseo89 小时前
谷歌SEO 站内搜索优化实战:把站内搜索词变成关键词金矿
java·服务器·数据库
qq_401700419 小时前
Qt 串口/网口通信:Hex 与 ASCII 编码转换深度指南
开发语言·数据库·qt
bug菌9 小时前
🤔同事突然问我:Spring的注解 @Component 和 @Service 有何不同?
java·spring boot·后端