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

阅读目录

    • 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;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件需求管理规程(Word原件2024)

软件开发人员及用户往往容易忽略信息沟通&#xff0c;这导致软件开发出来后不能很好地满足用户的需要&#xff0c;从而造成返工。而返工不仅在技术上给开发人员带来巨大的麻烦&#xff0c;造成人力、物力的浪费&#xff0c;而且软件的性能也深受影响。所以在软件项目开发周期的…

Bellman Ford算法:解决负权边图的最短路径问题

Bellman Ford算法的介绍 在计算机科学的世界中&#xff0c;Bellman Ford算法是一种解决单源最短路径问题的算法&#xff0c;它可以处理有负权边的图。这个算法的名字来源于两位科学家Richard Bellman和Lester Randolph Ford&#xff0c;他们是这个算法的发明者。 这个算法的主…

hive启动beeline报错

问题一在zpark启动集群报错 出现上面的问题执行以下代码 chmod 777 /opt/apps/hadoop-3.2.1/logs 问题二启动beeline报错 执行 cd /opt/apps/hadoop-3.2.1 bin/hadoop dfsadmin -safemode leave 问题三执行查询语句报错 执行 set hive.exec.mode.local.autotrue;

公考相丽君政治素养研习课

公考相丽君政治素养研习课&#xff0c;是广大公考学子提升政治素养、深化政治理解的宝贵课程。相丽君老师以其深厚的政治理论功底和丰富的教学经验&#xff0c;为学员们呈现了一堂生动而深刻的政治课。课程中&#xff0c;相老师深入浅出地讲解了政治理论的基本概念和核心思想&a…

Windows系统下将MySQL数据库表内的数据全量导入Elasticsearch

目录 下载安装Logstash 配置Logstash配置文件 运行配置文件 查看导入结果 使用Logstash将sql数据导入Elasticsearch 下载安装Logstash 官网地址 选择Windows系统&#xff0c;需下载与安装的Elasticsearch相同版本的&#xff0c;下载完成后解压安装包。 配置Logstash配…

ChuanhuChatGPT集成百川大模型

搭建步骤&#xff1a; 拷贝本地模型&#xff0c;把下载好的Baichuan2-7B-Chat拷贝到models目录下 修改modules\models\base_model.py文件&#xff0c;class ModelType增加Baichuan Baichuan 16 elif "baichuan" in model_name_lower: model_type ModelType.Ba…

(超全)python图像处理详细解析(3)

图像处理 23.保存视频每一帧图像24.把png图像转换成jpg并保存25.改变图像尺寸26.改变图像比例27.旋转图像28.亮度调整29.log对数调整30.判断图像对比度31.调整强度&#xff08;1&#xff09;强度调节&#xff08;2&#xff09;uint8转float 32.绘制直方图和均衡化33.彩色图片三…

基于streamlit快速部署机器学习项目(Public URL)

基于streamlit的AIGC项目前端展示 1.Streamlit 简介与入门1.1 安装 Streamlit1.2 开发Streamlit应用程序1.3 启动并运行1.3.1 本地运行1.3.2 部署 现在LLM技术发展迅速&#xff0c;很多人在学习的时候&#xff0c;都想展示效果&#xff0c;并且想部署在服务器上&#xff0c;但是…

原型链prototype、__proto、constructor的那些问题整理

再了解原型链之前,我们先来看看构造函数和实例对象的打印结构 - 函数 这里我们定义一个构造函数Fn,然后打印它的结构吧 function Fn(){} console.dir(Fn)控制台得到结构 从上面结构我们能看的出来,函数有两种原型,一种是作为函数特有的原型:prototype,另一种是作为对象的__…

数字旅游:通过科技赋能,创新旅游服务模式,提供智能化、个性化的旅游服务,满足游客多元化、个性化的旅游需求

目录 一、数字旅游的概念与内涵 二、科技赋能数字旅游的创新实践 1、大数据技术的应用 2、人工智能技术的应用 3、物联网技术的应用 4、云计算技术的应用 三、智能化、个性化旅游服务的实现路径 1、提升旅游服务的智能化水平 2、实现旅游服务的个性化定制 四、数字旅…

计算机网络大框架图形

如标题&#xff0c;精心画了一个计算机网络的框架性的图&#xff0c;包含了计算机网络的核心思想&#xff0c;在此分享和备份下。各层具体协议参考TCP/IP常用协议栈图解-CSDN博客

工厂数字化三部曲/业务、数据和IT融合

工厂数字化三部曲: 业务、数据和IT融合 在当今数字化转型的潮流中&#xff0c;企业面临着将业务、数据和IT融合的挑战和机遇。数字化转型不仅是技术上的升级&#xff0c;更是对企业运营模式和管理体系的全面优化和重构。通过业务“数字化”阶段的细致分析和整合&#xff0c;以及…

葡萄牙语翻译中文难吗,葡译中如何翻译比较好?

葡萄牙&#xff0c;一个充满魅力的国度&#xff0c;拥有着悠久的历史和丰富的文化传统。葡萄牙语作为这个国家的官方语言&#xff0c;在全球范围内享有广泛的声誉。那么&#xff0c;葡萄牙语翻译中文难吗&#xff1f;又该如何进行高质量的翻译呢&#xff1f; 业内人士指出&…

蛋糕购物商城

蛋糕购物商城 运行前附加数据库.mdf&#xff08;或使用sql生成数据库&#xff09; 登陆账号&#xff1a;admin 密码&#xff1a;123456 修改专辑价格时去掉&#xffe5;以及上传专辑图片 c#_asp.net 蛋糕购物商城 网上商城 三层架构 在线购物网站&#xff0c;电子商务系统 …

打造智能语音机器人-用语音控制机器人

人工智能现已成为国家发展重大战略&#xff0c;智能语音技术作为人工智能产业链上的关键一环&#xff0c;AI应用成熟的技术之一&#xff0c;人工智能的发展也进入了一个崭新的阶段。那么打造智能语音机器人怎样实现用语音控制机器人呢&#xff1f;和小编一起来看看。 选择合适的…

七天速记前端八股文(重点)

for in和正常for循环的区别 在遍历数组时&#xff0c;正常的 for 循环通常比 for...in 循环更适合。虽然 for...in 循环可以用于遍历数组&#xff0c;但它有一些潜在的问题和限制。 下面是一些使用 for 循环相对于 for...in 循环的优势&#xff1a; 顺序遍历&#xff1a;for…

61、回溯-分割回文串

思路&#xff1a; 还是全排列的思路&#xff0c;列出每一种组合&#xff0c;然后验证是否是回文&#xff0c;如果是子串放入path中&#xff0c;在验证其他元素是否也是回文。代码如下&#xff1a; class Solution {// 主方法&#xff0c;用于接收一个字符串s并返回所有可能的…

Prometheus数据模型与查询语言:构建高效监控系统的关键

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Prometheus&#xff1a;监控的神》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Prometheus诞生史 二、Prometheus的数据模型与查询语…

想要应聘前端工程师——了解前端招聘需求

市场对前端工程师的需求依然旺盛。所谓知己知彼,百战不殆,分析各个公司对前端工程师的招聘需求,一方面可以了解到前端各细分领域在企业的需求情况,调整自己对岗位和薪资的期待,另一方面可以获得各种前端技术在企业中的应用情况,调整自己的学习和面试准备方向。因篇幅所限…

Office Word自动编号转文本

原理 使用office自带的宏功能&#xff0c;一键替换 过程 调出word的“开发工具”选项 文件->选项->自定义功能区->选中开发工具->确定 创建宏 开发工具->宏->创建宏 编写宏 在弹出来的框里&#xff0c;替换代码为 Sub num2txt() ActiveDocument.…