LeetCode 面试题 08.02——迷路的机器人

news2024/11/24 9:28:21

阅读目录

    • 1. 题目
    • 2. 解题思路
    • 3. 代码实现

1. 题目

2. 解题思路

此题就是一个典型的图搜索题,一种就是广度优先搜索,一种就是深度优先搜索。

3. 代码实现

class Solution {
public:
    vector<vector<int>> pathWithObstacles(vector<vector<int>>& obstacleGrid) {
        vector<vector<int> > ret;
        int row = obstacleGrid.size();
        if (row < 1) {
            return ret;
        }
        int col = obstacleGrid[0].size();
        if (col < 1) {
            return ret;
        }
        int total = row * col;
        vector<int> pre_node(total, -1);    // 上一个节点
        pre_node[0] = -2;
        vector<int> visited(total, false);  // 节点是否被访问
        queue<int> need_to_visit;
        // 第一个节点是否是障碍
        if (obstacleGrid[0][0] != 1) {
            need_to_visit.push(0);
            visited[0] = true;
        }

        while (!need_to_visit.empty()) {
            int cur_node = need_to_visit.front();
            int i = cur_node / col;
            int j = cur_node % col;
            int next_node = (i + 1) * col + j;
            if (i+1 < row && obstacleGrid[i+1][j] != 1 && !visited[next_node]) {
                visited[next_node] = true;
                pre_node[next_node] = cur_node;
                need_to_visit.push(next_node);
                if (next_node == total - 1) {
                    break;
                }
            }
            next_node = i * col + j + 1;
            if (j+1 < col && obstacleGrid[i][j+1] != 1 && !visited[next_node]) {
                visited[next_node] = true;
                pre_node[next_node] = cur_node;
                need_to_visit.push(next_node);
                if (next_node == total - 1) {
                    break;
                }
            }
            need_to_visit.pop();
        }
        if (!visited[total-1]) {
            return ret;
        }
        // 打印出路径
        int pre_node_id = total-1;
        while (pre_node_id != -2) {
            int i = pre_node_id / col;
            int j = pre_node_id % col;
            vector<int> temp = {i, j};
            ret.push_back(temp);
            pre_node_id = pre_node[pre_node_id];
        }
        reverse(ret.begin(), ret.end());
        return ret;
    }
};
class Solution {
public:
    vector<int> visited;    // 节点是否被访问
    bool find;              // 是否到达最后一个
    vector<vector<int> > ret;

    void dfs(vector<vector<int>>& obstacleGrid, int i, int j, int row, int col) {
        if (find)
            return;
        if (i * col + j == row * col - 1) {
            find = true;
            return;
        }
        int next_node = (i + 1) * col + j;
        if (i+1 < row && obstacleGrid[i+1][j] != 1 && !visited[next_node]) {
            visited[next_node] = true;
            vector<int> temp = {i+1, j};
            ret.push_back(temp);
            dfs(obstacleGrid, i+1, j, row, col);
            if (!find) {
               ret.pop_back(); 
            } else {
                return;
            }
        }
        next_node = i * col + j + 1;
        if (j+1 < col && obstacleGrid[i][j+1] != 1 && !visited[next_node]) {
            visited[next_node] = true;
            vector<int> temp = {i, j+1};
            ret.push_back(temp);
            dfs(obstacleGrid, i, j+1, row, col);
            if (!find) {
               ret.pop_back(); 
            }
        }
    }

    vector<vector<int>> pathWithObstacles(vector<vector<int>>& obstacleGrid) {
        int row = obstacleGrid.size();
        if (row < 1) {
            return ret;
        }
        int col = obstacleGrid[0].size();
        if (col < 1) {
            return ret;
        }
        visited = vector<int>(row*col, false);
        find = false;
        // 第一个节点是否是障碍
        if (obstacleGrid[0][0] != 1) {
            vector<int> temp = {0, 0};
            ret.push_back(temp);
            dfs(obstacleGrid, 0, 0, row, col);
            if (!find) {
               ret.pop_back(); 
            }
        }
        return ret;
    }
};

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

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

相关文章

Go源码--Strconv库

简介 Strconv 库是一些跨类型的转换函数集合&#xff0c;大家应该很熟悉。源码没有什么难点&#xff0c;主要是面试题有可能会出这种类型的&#xff0c;所以简单介绍下&#xff0c;主要介绍 以下两种常用转换&#xff0c;其他的没细研究&#xff0c;感兴趣的可以看看。 Strco…

[笔试训练](八)

目录 022&#xff1a;求最小公倍数 023&#xff1a;数组中的最长连续子序列 024&#xff1a;字母收集 022&#xff1a;求最小公倍数 求最小公倍数_牛客题霸_牛客网 (nowcoder.com) 题目&#xff1a; 题解&#xff1a; 求最小公倍数公式&#xff1a;lcm(a,b)a*b/gcd(a,b)&am…

网页提示语闪太快的定位问题(selenium)

selenium UI自动化时&#xff0c;提示语闪太快&#xff0c;导致无法获取元素的问题 解决办法 步骤一&#xff1a; F12---》控制台输入debugger 步骤二&#xff1a;对于需要定位的部分&#xff0c;在控制台的debugger处回车&#xff0c;可以定住页面 步骤三&#xff1a;正常定…

win11 安装qt5.14.2 、qtcreator、vs编译器 。用最小安装进行 c++开发qt界面

系统 &#xff1a;win11 一、安装vs生成工具 &#xff0c;安装编译器 下载visualstudio tools 生成工具&#xff1a; 安装编译器 和 windows sdk&#xff1a; 安装debug 调试器&#xff1a; 二、Qt5.14.2下载 下载链接: Index of /archive/qt/5.14/5.14.2 安装qt 三、配置QT/…

MVP+敏捷开发

MVP敏捷开发 1. 什么是敏捷开发&#xff1f; 敏捷开发是一种软件开发方法论&#xff0c;旨在通过迭代、自组织的团队和持续反馈&#xff0c;快速响应需求变化并交付高质量的软件。相较于传统的瀑布模型&#xff0c;敏捷开发强调灵活性、适应性和与客户的紧密合作。敏捷开发方…

Llama网络结构介绍

LLaMA现在已经是开源社区里炙手可热的模型了&#xff0c;但是原文中仅仅介绍了其和标准Transformer的差别&#xff0c;并没有一个全局的模型介绍。因此打算写篇文章&#xff0c;争取让读者不参考任何其他资料把LLaMA的模型搞懂。 结构 如图所示为LLaMA的示意图&#xff0c;由…

解决ax = Axes3D(fig2)pycharm画3d图空白不显示问题

明明代码运行正确&#xff0c;却总是显示不出来 绘制出来的也是空白 改一下代码就好了 ax Axes3D(fig2) #原来代码 ax fig2.add_axes(Axes3D(fig2)) #改后代码 修改过后就可以显示了

【Jenkins】持续集成与交付 (三):有关报错解决(Jenkins (2.387.3) or higher required)

【Jenkins】持续集成与交付 (三):有关报错解决Jenkins (2.387.3) or higher required 一、Jenkins主页报错二、安装Jenkins插件报错三、解决过程(解压替换jenkins.war)四、重新访问登录💖The Begin💖点点关注,收藏不迷路💖 一、Jenkins主页报错 New version of J…

【nodejs状态库mobx之computed规则】

The above example nicely demonstrates the benefits of a computed value, it acts as a caching point. Even though we change the amount, and this will trigger the total to recompute, it won’t trigger the autorun, as total will detect its output hasn’t been …

一分钟了解期权合约转仓交易的流程

期权合约转仓交易的流程 期权合约转仓交易是指在期权交易过程中&#xff0c;交易者平掉手中现有的仓位&#xff0c;并选择更高或更低的行权价格&#xff0c;进行买入或卖出开仓的交易方法。转仓交易具有多个优势&#xff0c;包括降低风险、锁定利润、提高资金使用效率以及增加…

关于Github默认分支main和master以及如何在git init时指定默认分支

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

内置对象部分

一&#xff0c;内置对象 二&#xff0c;math对象 不是构造函数&#xff0c;不需要new来调用&#xff0c;而是直接使用里面的属性和方法即可 1.随机方法random 返回一个随机的小数 [0,1&#xff09; 2.日起格式化 返回的月份会小一&#xff0c;记得加一 周一返回1&#xff…

什么是储能电站的一次设备与二次设备?

随着国家政策导向和扶持&#xff0c;储能电站的建设&#xff0c;在各地均稳步推进&#xff0c;储能电站的设备主要分一次设备和二次设备两种&#xff0c;下面分别介绍这两方面内容&#xff1a; 储能电站一次设备 一次设备是储能电站的电路基础设施&#xff0c;包含变压器、主…

提升你的C编程技能:使用cURL下载Kwai视频

概述 本文将介绍如何利用C语言以及cURL库来实现Kwai视频的下载。cURL作为一个功能强大的网络传输工具&#xff0c;能够在C语言环境下轻松地实现数据的传输。我们还将探讨如何运用代理IP技术&#xff0c;提升爬虫的匿名性和效率&#xff0c;以适应Kwai视频平台的发展趋势。 正…

代码随想录算法训练营day40

题目&#xff1a;343. 整数拆分、96.不同的二叉搜索树 参考链接&#xff1a;代码随想录 343. 整数拆分 思路&#xff1a;五部曲来走。dp数组&#xff0c;dp[i]用于记录拆i得到的最大乘积和&#xff0c;我们要求的也就是dp[n]&#xff1b;递推公式&#xff0c;我们想拆分i&am…

简单把玩下SpringAI

Hello大家好&#xff0c;今天写一些不烧脑的文章&#xff0c;我们来体验一下Spring的新框架Spring AI&#xff0c;只是简单玩玩不深入&#x1f60f; Spring AI 简介 Spring AI是为了简化人工智能相关应用程序的开发Spring AI的诞生&#xff0c;灵感来自于LangChain等项目 Oll…

江苏开放大学2024年春《会计基础 050266》第二次任务:第二次过程性考核参考答案

电大搜题 多的用不完的题库&#xff0c;支持文字、图片搜题&#xff0c;包含国家开放大学、广东开放大学、超星等等多个平台题库&#xff0c;考试作业必备神器。 公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#…

Windows常见问题(技巧)总结

目录 问题Windows中更改快捷方式图标windows 中网速很慢,如何解决?因为Authenticated Users从其父系继承承权限&#xff0c;你无法删除此对象.Windows下的照片软件在哪个文件夹下?如何批量更改文件名?Windows 电脑pagefile.sys是什么文件,可以删除吗?U盘中打开文件时提示&a…

平衡小车的控制算法--结合自动控制原理学习

单纯的去看自控原理&#xff0c;很多概念有点抽象&#xff0c;最好找些应用去理解相关的概念&#xff0c;就找了实验室的一个平衡小车作为应用&#xff0c;不过主要根据小车去跑matlab去验证一些控制算法。结合台湾国立交通大学林沛群的自控线上课的总结 一、自控原理重要概念 …

Liunx下用C语言模拟实现 —— 封装文件操作接口

一、前提 本篇博客将循序渐进的模拟实现C语言中&#xff0c;简单版的对FILE和一些简单的文件操作接口的实现&#xff0c;在上一篇文件操作原理篇我们知道&#xff0c;实际的实现就是对系统接口的封装&#xff0c;为了巩固和练习之前学到的概念&#xff0c;我们也来简单的实现对…