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

2024-04-27 04:52

本文主要是介绍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;}
};

这篇关于LeetCode 面试题 08.02——迷路的机器人的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/939567

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

一些其他面试题

阿里二面:那你来说说定时任务?单机、分布式、调度框架下的定时任务实现是怎么完成的?懵了。。_哔哩哔哩_bilibili 1.定时算法 累加,第二层每一个格子是第一层的总时间400 ms= 20 * 20ms 2.MQ消息丢失 阿里二面:高并发场景下引进消息队列有什么问题?如何保证消息只被消费一次?真是捏了一把汗。。_哔哩哔哩_bilibili 发送消息失败

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

zookeeper相关面试题

zk的数据同步原理?zk的集群会出现脑裂的问题吗?zk的watch机制实现原理?zk是如何保证一致性的?zk的快速选举leader原理?zk的典型应用场景zk中一个客户端修改了数据之后,其他客户端能够马上获取到最新的数据吗?zk对事物的支持? 1. zk的数据同步原理? zk的数据同步过程中,通过以下三个参数来选择对应的数据同步方式 peerLastZxid:Learner服务器(Follo

java常用面试题-基础知识分享

什么是Java? Java是一种高级编程语言,旨在提供跨平台的解决方案。它是一种面向对象的语言,具有简单、结构化、可移植、可靠、安全等特点。 Java的主要特点是什么? Java的主要特点包括: 简单性:Java的语法相对简单,易于学习和使用。面向对象:Java是一种完全面向对象的语言,支持封装、继承和多态。跨平台性:Java的程序可以在不同的操作系统上运行,称为"Write once,