Marscode小M的星球时代冒险——灵活bfs或dfs

news2025/1/3 17:40:56

小M的星球时代冒险 - MarsCode

一.bfs

字节的简单题对我来说一如既往的难啊......

最开始想的是回溯,但貌似不需要有用回溯节省新开辟空间的地方。

从做题角度,一般m*n矩阵不是bfs就是dfs或者二维动态规划。难点在于它不是简单的岛屿问题,或者最短路径什么的。难点在于每次向四个方向移动时,以前遍历过的位置还要遍历吗,应该要才行,因为不确定这个路径到遍历过的位置会不会跨越次数更少,但这样不会导致死循环吗,比如绕着个正方形一直死循环遍历。所以要很灵活的定义为,未遍历过或者跨越次数更少才允许往这个方向移动。

ERROR: 坑还多,传递的array的索引是从1开始的,还要减1处理。

import java.util.ArrayDeque;
import java.util.Queue;

public class Main {
    // 上下左右
    public static final int[] dx = new int[] { -1, 1, 0, 0 };
    public static final int[] dy = new int[] { 0, 0, -1, 1 };

    public static int[] solution(int n, int m, int[] a, int[] b, int q, int[][] array) {
        // Edit your code here
        int[] ans = new int[q];

        for (int i = 0; i < q; i++) {
            ans[i] = bfs(n, m, a, b, array[i]);
        }
        return ans;
    }

    public static int bfs(int n, int m, int[] a, int[] b, int[] arr) {
        int[][] visited = new int[n][m];
        // 初始化
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                visited[i][j] = -1;
            }
        }


        int x1 = arr[0]-1, y1 = arr[1] - 1;
        visited[x1][y1] = 0;
        int[] point1 = new int[]{x1, y1};
        int x2, y2;

        //队列
        Queue<int[]> queue = new ArrayDeque<>();
        queue.add(point1);
        while(!queue.isEmpty()) {
            point1 = queue.poll();
            // 判断地形
            boolean p1 = (a[point1[0]] == b[point1[1]]?true:false);
            for(int i = 0; i < 4; i++) {
                x2 = (point1[0] + dx[i] + n)%n;
                y2 = (point1[1] + dy[i] + m)%m;
                // 判断地形
                boolean p2 = (a[x2] == b[y2]?true:false);
                //是否跨越地形
                int cnt = (p1 == p2 ? 0 : 1);
                // 未访问过,或者是跨越次数更少的路径
                if(visited[x2][y2] == -1 || visited[point1[0]][point1[1]] + cnt < visited[x2][y2]) {
                    visited[x2][y2] = visited[point1[0]][point1[1]] + cnt;
                    queue.add(new int[]{x2, y2});
                }
            }
        }
        return visited[arr[2]-1][arr[3]-1];
    }

    public static void main(String[] args) {
        // Add your test cases here
        System.out.println(java.util.Arrays.equals(solution(3, 4, new int[] { 0, 1, 1 }, new int[] { 0, 1, 1, 0 }, 2,
                new int[][] { { 2, 1, 3, 3 }, { 2, 4, 2, 1 } }), new int[] { 1, 0 }));
        System.out.println(java.util.Arrays.equals(solution(3, 4, new int[] { 0, 1, 1 }, new int[] { 0, 0, 1, 1 }, 2,
                new int[][] { { 1, 2, 2, 2 }, { 2, 1, 2, 3 } }), new int[] { 1, 1 }));
    }
}

当然也可以用手动栈或者递归dfs实现。

二.dfs手动栈实现

import java.util.ArrayDeque;
import java.util.Deque;

public class Main {
    // 上下左右
    public static final int[] dx = new int[] { -1, 1, 0, 0 };
    public static final int[] dy = new int[] { 0, 0, -1, 1 };

    public static int[] solution(int n, int m, int[] a, int[] b, int q, int[][] array) {
        // Edit your code here
        int[] ans = new int[q];

        for (int i = 0; i < q; i++) {
            ans[i] = dfs(n, m, a, b, array[i]);
        }
        return ans;
    }

    public static int dfs(int n, int m, int[] a, int[] b, int[] arr) {
        int[][] visited = new int[n][m];
        // 初始化
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                visited[i][j] = -1;
            }
        }


        int x1 = arr[0]-1, y1 = arr[1] - 1;
        visited[x1][y1] = 0;
        int[] point1 = new int[]{x1, y1};
        int x2, y2;

        int px2 = arr[2]-1,py2 = arr[3] - 1;
        //栈
        Deque<int[]> stack = new ArrayDeque<>();
        stack.add(point1);
        while(!stack.isEmpty()) {
            point1 = stack.pop();
            // 判断地形
            boolean p1 = (a[point1[0]] == b[point1[1]]?true:false);
            if(point1[0] == px2 && point1[1] == py2)
                continue;
            for(int i = 0; i < 4; i++) {
                x2 = (point1[0] + dx[i] + n)%n;
                y2 = (point1[1] + dy[i] + m)%m;
                // 判断地形
                boolean p2 = (a[x2] == b[y2]?true:false);
                //是否跨越地形
                int cnt = (p1 == p2 ? 0 : 1);
                // 未访问过,或者是跨越次数更少的路径
                if(visited[x2][y2] == -1 || visited[point1[0]][point1[1]] + cnt < visited[x2][y2]) {
                    visited[x2][y2] = visited[point1[0]][point1[1]] + cnt;
                    stack.push(new int[]{x2, y2});
                }
            }
        }
        return visited[arr[2]-1][arr[3]-1];
    }

    public static void main(String[] args) {
        // Add your test cases here
        System.out.println(java.util.Arrays.equals(solution(3, 4, new int[] { 0, 1, 1 }, new int[] { 0, 1, 1, 0 }, 2,
                new int[][] { { 2, 1, 3, 3 }, { 2, 4, 2, 1 } }), new int[] { 1, 0 }));
        System.out.println(java.util.Arrays.equals(solution(3, 4, new int[] { 0, 1, 1 }, new int[] { 0, 0, 1, 1 }, 2,
                new int[][] { { 1, 2, 2, 2 }, { 2, 1, 2, 3 } }), new int[] { 1, 1 }));
    }
}

三,递归版dfs

import java.util.ArrayDeque;
import java.util.Deque;

public class Main {
    // 上下左右
    public static final int[] dx = new int[] { -1, 1, 0, 0 };
    public static final int[] dy = new int[] { 0, 0, -1, 1 };

    public static int[] solution(int n, int m, int[] a, int[] b, int q, int[][] array) {
        // Edit your code here
        int[] ans = new int[q];
        
        for (int i = 0; i < q; i++) {
            int[][] visited = new int[n][m];
            // 初始化
            for (int j = 0; j < n; j++) {
                for (int k = 0; k < m; k++) {
                    visited[j][k] = -1;
                }
            }
            visited[array[i][0]-1][array[i][1]-1]= 0;
            dfs(a, b, visited, new int[]{array[i][0]-1, array[i][1]-1},new int[]{array[i][2]-1, array[i][3]-1});
            ans[i] = visited[array[i][2]-1][array[i][3]-1];
        }
        return ans;
    }

    public static void dfs(int[] a, int[] b, int[][] visited, int[] cur, 
                            int[] dst) {
        if(cur[0] == dst[0] && cur[1] == dst[1])
            return;

        // 判断地形
        boolean p1 = (a[cur[0]] == b[cur[1]]?true:false);
        int n = a.length, m = b.length;
        for(int i = 0; i < 4; i++) {
            int x2 = (cur[0] + dx[i] + n)%n;
            int y2 = (cur[1] + dy[i] + m)%m;
            // 判断地形
            boolean p2 = (a[x2] == b[y2]?true:false);
            //是否跨越地形
            int cnt = (p1 == p2 ? 0 : 1);
            // 未访问过,或者是跨越次数更少的路径
            if(visited[x2][y2] == -1 || visited[cur[0]][cur[1]] + cnt < visited[x2][y2]) {
                visited[x2][y2] = visited[cur[0]][cur[1]] + cnt;
                dfs(a, b, visited, new int[]{x2, y2}, dst);
            }   
        }     
    }

    public static void main(String[] args) {
        // Add your test cases here
        System.out.println(java.util.Arrays.equals(solution(3, 4, new int[] { 0, 1, 1 }, new int[] { 0, 1, 1, 0 }, 2,
                new int[][] { { 2, 1, 3, 3 }, { 2, 4, 2, 1 } }), new int[] { 1, 0 }));
        System.out.println(java.util.Arrays.equals(solution(3, 4, new int[] { 0, 1, 1 }, new int[] { 0, 0, 1, 1 }, 2,
                new int[][] { { 1, 2, 2, 2 }, { 2, 1, 2, 3 } }), new int[] { 1, 1 }));
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2268756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java [后端] 开发日常记录(1)

目录 1、常用的注解 2、对字符串的处理 3、对JSON串的处理 -- The End -- 详细如下&#xff1a; 1、常用的注解 若返回的字段中有NUll&#xff0c;则不返回 JsonInclude(value JsonInclude.Include.NON_NULL) //在实体类中添加这个注解 JsonInclude(JsonInclude.Include.NON…

LabVIEW声波谐振管自动化测量系统

开发了一种基于LabVIEW的声波谐振管自动化测量系统。该系统利用LabVIEW的强大功能&#xff0c;实现了对声波谐振频率的精确测量&#xff0c;提高了实验数据的采集效率和准确性。系统主要应用于物理教学和科研中&#xff0c;用于研究声波在谐振管中的传播特性。 项目背景 传统的…

2024/12/29 黄冈师范学院计算机学院网络工程《路由期末复习作业一》

一、选择题 1.某公司为其一些远程小站点预留了网段 172.29.100.0/26&#xff0c;每一个站点有10个IP设备接到网络&#xff0c;下面那个VLSM掩码能够为该需求提供最小数量的主机数目 &#xff08; &#xff09; A./27 B./28 C./29 D./30 -首先审题我们需要搞清楚站点与网…

el-table动态行和列及多级表头

主页面 <template><div class"result-wrapper"><dynamic-table :table-data"tableData" :table-header"tableConfig" :tableTitle"tableTitle" :flowParams"flowParams"></dynamic-table></div…

✨✨vue3自定义动态不同UI组件筛选框案例✨

✨1. 实现功能 &#x1f31f;添加条件进行数据筛选 根据筛选数据条件不同&#xff0c;显示不同的UI组件&#xff1a;包含datetime、select、input等筛选完条件可继续添加与取消条件当然可以在条件列表中进行直接删除&#xff0c;当删除完所有条件之后&#xff0c;回到添加条件…

Go+chromedp实现Web UI自动化测试

1.为什么使用go进行UI自动化测试&#xff1f; 速度&#xff1a;Go速度很快&#xff0c;这在运行包含数百个UI测试的测试套件时是一个巨大的优势 并发性&#xff1a;可以利用Go的内置并发性(goroutines)来并行化测试执行 简单&#xff1a;Go的简约语法允许您编写可读且可维护…

总结TCP/IP四层模型

总结TCP/IP四层模型 阅读目录(Content) 一、TCP/IP参考模型概述 1.1、TCP/IP参考模型的层次结构二、TCP/IP四层功能概述 2.1、主机到网络层  2.2、网络互连层  2.3、传输层  2.3、应用层 三、TCP/IP报文格式 3.1、IP报文格式3.2、TCP数据段格式3.3、UDP数据段格式3.4、套…

怎么在家访问公司服务器?

在日常工作中&#xff0c;特别是对信息技术从业者而言&#xff0c;工作往往离不开公司的服务器。他们需要定期访问服务器&#xff0c;获取一些关键的机密文件或数据。如果您在家办公&#xff0c;并且需要处理未完成的任务&#xff0c;同时需要从公司服务器获取所需的数据&#…

自动化文档处理:Azure AI Document Intelligence

Azure AI Document Intelligence支持多种文件格式&#xff0c;包括PDF、JPEG、PNG等。其核心功能是将这些文档按页进行内容提取&#xff0c;并转化为LangChain文档。其默认输出格式是Markdown&#xff0c;这使得文档可以通过MarkdownHeaderTextSplitter进行语义分片。您也可以使…

ubuntu快速入门

1.进入某个文件夹 cd workspace/2.tab自动补全 3.列出当前文件夹所有文件 ls列出所有文件包括隐藏文件 ls -a 4.创建文件夹 mkdir linuxLearn 5.创建文件 gedit command.sh在commmand.sh键入 echo hello echo hi? echo how are you? PS:touch hello.txt(也可以创建新…

在虚幻引擎4(UE4)中使用蓝图的详细教程

在虚幻引擎4&#xff08;UE4&#xff09;中使用蓝图的详细教程 虚幻引擎4&#xff08;Unreal Engine 4&#xff0c;简称UE4&#xff09;是一款功能强大的游戏引擎&#xff0c;广泛应用于游戏开发、虚拟现实、建筑可视化等领域。UE4 提供了一个强大的可视化脚本工具——蓝图&am…

修改网络ip地址方法有哪些?常用的有这四种

在数字时代&#xff0c;IP地址作为网络设备的唯一标识&#xff0c;对于网络连接和通信至关重要。然而&#xff0c;有时候我们可能需要修改设备的IP地址&#xff0c;以满足特定的网络需求或解决网络问题。本文将为您详细介绍几种修改网络IP地址的常用方法&#xff0c;无论是对于…

你了解DNS吗?

你了解DNS吗&#xff1f; 一. 介绍二. DNS的工作原理三. DNS查询流程示意图四. DNS 记录类型五. DNS的安全问题与 DNSSEC 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一. 介绍 …

Android笔试面试题AI答之非技术问题(3)

Android入门请看《Android应用开发项目式教程》 文章目录 1.你是如何应付项目经理的&#xff1f;**1. 建立清晰的沟通机制****2. 明确项目目标与优先级****3. 制定合理的开发计划****4. 管理项目风险****5. 推动敏捷开发****6. 管理需求变更****7. 提升团队协作****8. 关注项目…

TestMAX/DFT Compiler:时序单元的类型、连接顺序和后DFT优化

相关阅读 TestMAX/DFT Compilerhttps://blog.csdn.net/weixin_45791458/category_12865937.html?spm1001.2014.3001.5482 时序单元的状态 未映射的时序单元(Unmapped Sequential Cell) 在Design Compiler读取了一个RTL设计后&#xff0c;Design Compiler内置的HDL Compiler工…

操作012:延迟插件

文章目录 操作012&#xff1a;延迟插件一、插件简介二、插件安装1、确定卷映射目录2、下载延迟插件3、启用插件4、确认 三、创建交换机四、代码测试1、生产者端代码2、消费者端代码①情况A&#xff1a;资源已创建②情况B&#xff1a;资源未创建 3、执行效果①交换机类型②生产者…

Kafka 性能提升秘籍:涵盖配置、迁移与深度巡检的综合方案

文章目录 1.1.网络和io操作线程配置优化1.2.log数据文件刷盘策略1.3.日志保留策略配置1.4.replica复制配置1.5.配置jmx服务1.6.系统I/O参数优化1.6.1.网络性能优化1.6.2.常见痛点以及优化方案1.6.4.优化参数 1.7.版本升级1.8.数据迁移1.8.1.同集群broker之间迁移1.8.2.跨集群迁…

【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(二)

****非斜体正文为原文献内容&#xff08;也包含笔者的补充&#xff09;&#xff0c;灰色块中是对文章细节的进一步详细解释&#xff01; 3.1.2 基于注意力的解释&#xff08;Attention-Based Explanation&#xff09; 注意力机制可以揭示输入数据中各个部分之间的关系&#…

音视频采集推流时间戳记录方案

音视频同步更多文章 深入理解音视频pts&#xff0c;dts&#xff0c;time_base以及时间数学公式_视频pts计算-CSDN博客 ffplay音视频同步分析_ffplay 音视频同步-CSDN博客 音视频采集打时间戳设计 实时音视频数据的采集和处理场景。具体来说: 采集阶段: 在音视频数据采集过…

「numpy」numpy初步、ndarray、创建数组

Numpy 初步、ndarray、创建数组 【目录】 简介 ndarray介绍 ndarray用法 ndarray基本操作 一、numpy简介 Numpy&#xff08;Numerical Python&#xff09;是一个开源的Python科学计算库&#xff0c;用于快速处理任意维度的数组。 Numpy支持常见的数组和矩阵操作。对于同样…