LintCode 1364: the minium distance (BFS 传送门好题)

W5500+STM32F103C8T6进行TCP通信(modbus) 一路生花一、w5500资料二、modbus通信三、从机代码四、总结五、参考 一、w5500资料 w5500的资料就放在下面了,单纯的客户端和其他模式上面有教程 https://www.aliyundrive.com/s/enPnnZgNtpE 二、modbus通信 Modbus RTU通信时使用的数据帧结构如下图,而Moubus TCP通信的数据帧和这个稍微不一样,没有crc检验,因为tcp本就是一种可靠传输协议 这里是Modbus TCP数据帧 公共功能码定义 三、从机代码 阅读详情

1364. the minium distance

You are now given a two-dimensional tabular graph , in which each grid contains a integer num.

If num is - 2, it means this grid is the starting grid. If num is - 3, it means this grid is the ending grid. If num is - 1, it means this grid has an obstacle on it and you can't move to it. If num is a positive number or 0,you can walk normally on it.

In each move you can travel from one grid to another if and only if they're next to each other or they contain the same positive number num. The cost of each move is 1.

Now you are asked to find the lowest cost of travelling from the starting grid to the ending grid. If the ending grid could not be reached, print -1.

Example

Example
Input:[[1,0,-1,1],[-2,0,1,-3],[2,2,0,0]]
Output:3
In this example,you can reach the ending grid through these moves:
First, move up from the starting grid to the grid that contains the number 1. Second, move to the grid with the same number at the top right.
Finally, move down to the ending grid. There are three moves in total, so the minimun cost will be 3.

Notice

It is guaranteed that the maxium number of rows and columns is 400, and the number in each grid will not exceed 50.

Input test data (one parameter per line)How to understand a testcase?
 

解法1:
这是典型的传送门题目。其实就是用BFS,然后把传送门当作第5维就可以了。

class Solution {
public:
    /**
     * @param mazeMap: a 2D grid
     * @return: return the minium distance
     */
    int getMinDistance(vector<vector<int>> &mazeMap) {
        int num_row = mazeMap.size();
        int num_col = mazeMap[0].size();
        vector<vector<int>> visited(num_row, vector<int>(num_col, false));
        
        vector<bool> visited_fast_door(51, false); //if the fast door number is used.
        vector<vector<pair<int, int>>> fast_door(51); //each entry records the list of doors (row, col) that have the number i
        
        queue<pair<int, int>> q;
        pair<int, int> source, destination;
        vector<vector<int>> distance(num_row, vector<int>(num_col, 0));

        for (int i = 0; i < num_row; ++i) {
            for (int j = 0; j < num_col; ++j) {
                if (mazeMap[i][j] == -2) {
                    source = {i, j};
                 } else if (mazeMap[i][j] == -3) {
                    destination = {i, j};
                 } else if (mazeMap[i][j] > 0) {
                    fast_door[mazeMap[i][j]].push_back({i, j});
                    visited_fast_door[mazeMap[i][j]] = false;
                }
            }
        }

        q.push(source);
        visited[source.first][source.second] = true;
        vector<int> dx = {0, 0, 1, -1};
        vector<int> dy = {1, -1, 0, 0};
        while(!q.empty()) {
            int qSize = q.size();
            for (int i = 0; i < qSize; ++i) {
                auto front = q.front();
                q.pop();
                int x = front.first;
                int y = front.second;
                int index = mazeMap[x][y];
                int dist = distance[x][y];
                
                if (front == destination) {
                    return distance[x][y];
                }
                for (int j = 0; j < 4; ++j) {
                    int newX = front.first + dx[j];
                    int newY = front.second + dy[j];
                    if (newX < 0 || 
                        newX >= num_row || 
                        newY < 0 || 
                        newY >= num_col || 
                        visited[newX][newY] ||
                        mazeMap[newX][newY] == -1) {
                            continue;
                    } else {
                        q.push({newX, newY});
                        visited[newX][newY] = true;
                        distance[newX][newY] = dist + 1;
                    }
                }

                //the 5th dimension, check if it is fast door
                if (index > 0) {
                    if (visited_fast_door[index]) {
                        continue;
                    } else {
                        for (int i = 0; i < fast_door[index].size(); ++i) {
                            int newX = fast_door[index][i].first;
                            int newY = fast_door[index][i].second;
                            if (visited[newX][newY]) continue;
                            visited[newX][newY] = 1;
                            distance[newX][newY] = dist + 1;
                            q.push(fast_door[index][i]);
                        }
                        visited_fast_door[index] = true;
                    }
                }
            }

        }
        
        return -1;
    }
};

解法2:跟解法1一样,但不用distance数组,仍然用steps

class Solution {
public:
    /**
     * @param mazeMap: a 2D grid
     * @return: return the minium distance
     */
    int getMinDistance(vector<vector<int>> &mazeMap) {
        int num_row = mazeMap.size();
        int num_col = mazeMap[0].size();
        vector<vector<int>> visited(num_row, vector<int>(num_col, false));
        
        vector<bool> visited_fast_door(51, false); //if the fast door number is used.
        vector<vector<pair<int, int>>> fast_door(51); //each entry records the list of doors (row, col) that have the number i
        
        queue<pair<int, int>> q;
        pair<int, int> source, destination;

        for (int i = 0; i < num_row; ++i) {
            for (int j = 0; j < num_col; ++j) {
                if (mazeMap[i][j] == -2) {
                    source = {i, j};
                 } else if (mazeMap[i][j] == -3) {
                    destination = {i, j};
                 } else if (mazeMap[i][j] > 0) {
                    fast_door[mazeMap[i][j]].push_back({i, j});
                    visited_fast_door[mazeMap[i][j]] = false;
                }
            }
        }
        int steps = 0;
        q.push(source);
        visited[source.first][source.second] = true;
        vector<int> dx = {0, 0, 1, -1};
        vector<int> dy = {1, -1, 0, 0};
        while(!q.empty()) {
            int qSize = q.size();
            for (int i = 0; i < qSize; ++i) {
                auto front = q.front();
                q.pop();
                int x = front.first;
                int y = front.second;
                int index = mazeMap[x][y];

                if (front == destination) {
                    return steps;
                }
                for (int j = 0; j < 4; ++j) {
                    int newX = front.first + dx[j];
                    int newY = front.second + dy[j];
                    if (newX < 0 || 
                        newX >= num_row || 
                        newY < 0 || 
                        newY >= num_col || 
                        visited[newX][newY] ||
                        mazeMap[newX][newY] == -1) {
                            continue;
                    } else {
                        q.push({newX, newY});
                        visited[newX][newY] = true;
                    }
                }

                //the 5th dimension, check if it is fast door
                if (index > 0) {
                    if (visited_fast_door[index]) {
                        continue;
                    } else {
                        for (int i = 0; i < fast_door[index].size(); ++i) {
                            int newX = fast_door[index][i].first;
                            int newY = fast_door[index][i].second;
                            if (visited[newX][newY]) continue;
                            visited[newX][newY] = 1;
                            q.push(fast_door[index][i]);
                        }
                        visited_fast_door[index] = true;
                    }
                }
            }
            steps++;

        }
        
        return -1;
    }
};

 

Wider Face+YOLOV7人脸检测 使用Wider Face数据集训练YOLOV7 阅读详情

相关推荐

Imatest-Star模块(西门子星图)

星图分析指南:基于ISO12233标准的MTF测试方法,通过放射状射线和正弦灰度变化评估相机SFR性能。

weixin_64706696的博客 1565

Error Code: 1364. Field ‘createdAt‘ doesn‘t have a default value

问题:执行数据插入逻辑时,出现以下错误失败 结论:由于sql mode为STRICT_TRANS_TABLES导致的 查询当前的sql mode select @@GLOBAL.sql_mode; 设置sql mode SET GLOBAL sql_mode = ''; 截图如下: 重新设置sql mode后,执行插入: 可以成功插入数据,但是依然有错误提示 —待后续更新— ...

adam_De的博客 1193

最新版IAR9.40和注册工具

IAR最新版的IDE在编译速度和代码提示等各个方面上都有很大提升,软件这个东西果然还是越新越好。之前的时候,IAR v9系列网上很多人都说能用,但是又没有把 IAR v9系列的注册方法写的很清楚,导致我一直都用注册老版本v8的方法去注册v9。结果注册后都会提示。

xue_nuo的博客 4万+

leetcode 1364. 顾客的可信联系人数量----两种解法更新

顾客的可信联系人数量 题目分析:这题的题目读起来就很复杂,下面我们来简单拆解一下。题目给了这几张表 这是一张顾客表,其中customer_id存储的是顾客的唯一标识id。同时customer_name和email是这位顾客的名字和邮箱。 这是一张联系表,存储的是顾客的联系人信息。什么叫顾客的联系人信息?和商店给顾客顾客安排售后联系人一样,一个顾客可能有好几个联系人,看下面这张存储了联系人信息的contacts表。 上面这张表的含义是user_id为1的客户有三个联系人,分别是Bob,John,Jal

zr1213159840的博客 636

Centos7网络配置(设置固定ip)

刚安装完系统,有的人尤其没有勾选自动网络配置的情况下,是访问不了外网的,本机也连不通虚拟机。或者现在有的是动态ip,几次之后启动ip地址就变了,会导致其他软件或程序之前连接配置要重新更改,很麻烦,下面讲解一下如何配置网络,如何设置成固定ip。

个人笔记git:https://gitee.com/tlangp/note.git 8053

手把手教你用Proteus仿真51单片机抢答器:倒计时+蜂鸣器报警完整项目

本文详细介绍了使用Proteus软件仿真51单片机智能抢答器的完整项目流程。通过系统架构设计、核心元件选型(如74LS30用于按键中断编码),结合状态机编程,实现了带可调倒计时、数码管显示和蜂鸣器报警的八路抢答器功能。项目涵盖了从原理图绘制到代码调试的全过程,是学习嵌入式系统开发的绝佳实践。

tcp8optimizer的博客 262

走迷宫--bfs

题意:走迷宫,但是加入了传送门,传送门分为入口和出口 输入:多case           迷宫大小n,m           输入无空格间隔n行01串(0代表可以走,1代表是墙)           输入q           q行传送门的入口和出口的坐标           终点和起点的坐标 思路:bfs,传送门无非就是换个地方继续bfs 代码:       #includ...

qq_40306845的博客 1188

从Unitree B2W到四足机器人:用Isaac Lab构建强化学习奖励函数的5个实战技巧

本文分享了在Isaac Lab仿真环境中,为Unitree B2W等四足机器人设计强化学习奖励函数的5个核心实战技巧。内容涵盖奖励函数的结构化组合、轮腿混合机器人的适配策略、课程学习的动态调整、域随机化增强鲁棒性以及高效的调试可视化方法,旨在帮助开发者构建更稳定、高效的机器人运动策略。

lg888的博客 1065

蓝桥杯算法心得——迷宫(bfs+映射+HashMap)

大家好,我是晴天学长,bfs经典题目迷宫,也蓝桥杯真题之一,运用到了传统的bfs加上映射技巧,并用HashMap储蓄了传送门,需要的小伙伴请自取哦!💪💪💪

晴天学长 409

harbor x509: certificate signed by unknown authority【20251222】

本教程通过「合并证书链(服务器端)+ 预置根 CA(客户端)」彻底解决了自签名证书的 x509 错误,同时集成了 Trivy 漏洞扫描,实现了 Harbor 从搭建到实用的全流程。证书链合并是服务器端的关键,确保客户端获取完整信任路径;客户端需同时配置「系统信任库 + Docker 信任目录」,避免 Docker 独立信任机制导致的问题;所有 IP 需保持一致(Harbor 配置、证书绑定、客户端访问),是避免错误的基础。

老韩的Linux云计算架构师进阶之路 681

无限泛化!AI背景文字识别,腾讯文字六宫格

本文介绍了生成大规模文字验证码数据集的方法,通过使用上百种字体和2万+字库,结合随机背景和数十种图像增强技术,生成了2000万+的多样化样本。该方法采用二阶段训练策略,确保模型对字体、形态、形变等具有强泛化能力,可适配腾讯、咸鱼等多种平台的文字验证码识别,包括生僻字和复杂形变情况。生成的模型在多种验证码场景下表现优异,但强调该方法仅用于技术研究,严禁非法用途。

码王吴彦祖的博客 562

穿越(BFS)

题目描述 亚马逊雨林实在是太大了,小X和他的小弟们进去一会儿就迷路了,然而大雨已经来临,冲刷了一些道路,小X凭借他最后的5%的电量给你发来一条求助信息,希望你帮助他们逃出困境…… 小X给你发来一张n×m的地图,每一个点有4种情况。 “0”:此地方可以走。 “1”:此地方不可以走。 “2”:此地方有一种凶恶的野兽。 “3”:此地方为传送地域。 野兽会不定时地苏醒过来,此阶段该处就不能走。 暴雨会不定时地冲刷一些地区,这些地区从今往后不可以行走,也不可以传送到。 传送地域之间可以互相传送,即可..

JJJeeerrrrrryyy的博客 301

科技与伦理的平衡点:人类计算的伦理

科技与伦理的平衡点:人类计算的伦理 关键词 科技与伦理 人类计算 隐私问题 道德决策自动化 公平性与偏见 法律与社会责任 摘要 本

AI天才研究院 1162

【Leetcode】3656. Determine if a Simple Graph Exists

需要用到Erdős–Gallai theorem,参考。阶无向无权图每个点的度数组。

数学、算法爱好者的博客 263

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LintCode领扣算法问题答案:1364. 最短路径

1364. 最短路径 描述 给出一个2维的表格图,其中每个格子上有一个数字num 如果num是-2表示这个点是起点,num是-3表示这个点是终点,num是-1表示这个点是障碍物不能行走,num为 0 表示这个点是道路可以正常行走 如果num是正数,表示这个点 是传送门,则这个点可以花费1的代价到达有着相同数字的传送门格子中 每次可以花费1的代价向上下左右四个方向之一行走一格,传送门格子也可以往四个方向走求出从起点到终点的最小花费,如果不能到达返回-1 图最大是400*400的; 传送门的种类不会超过

二当家的白帽子 1293

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

拯救小Q (多传送门求最短路径问题)(bfs)

迷宫里面有一些陷阱,一旦走到陷阱里,就会被困身亡:(,迷宫里还有一些古老的传送阵,一旦走到传送阵上,会强制被传送到传送阵的另一头。小写字母'a'-'z'表示分别表示不同的传送阵,数据保证传送阵两两配对。同时我们也可以把需要的数据全开了 这里我们采用临链表的方式对 传送的存储与查找 一下是作者开的变量(可能存在冗余)每组数据输出一行,解救小Q所需的最少步数,如果无论如何都无法救小Q,输出-1。'Q'表示小Q的位置,'L'表示love8909所在位置,'.'表示安全的位置,'#'表示陷阱,

2403_87301951的博客 817

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

codeforce 1364 A-XXXXX

题目 题意:给出一个长度为n的数组,可一个数m,求该数组不能除以m的最大子数组的长度。 思路:对于两个数一个余m等于0,一个余m不等于0,两数相加,结果余m不等于0 可以通过记录下标,然后找到最大子数组的长度 AC代码: ...

nankes的博客 256

MySql_ErrorCode1364

Unable to translate SQLException with Error code '1364' error code [1364]; Field 'id' doesn't have a default value; nested exception is java.sql.SQLException: Field 'id' doesn't have a default value ...

weixin_33724046的博客 341

Codevs1364寻宝题解

http://codevs.cn/problem/1364/题解 一看就是一道最短路的题。设起点、终点,按题意一条条地添边。每层楼都是环状的,终点在第N+1层,添边时要格外小心。有点分层图的意思。堆优化dijkstra耐心写下去。本题考最短路,还考耐心。 Code #include <cstdio> #include <cstring> #include <queue> #include <alg

t14t41t的专栏 958

codevs2059逃出克隆岛(传送门bfs)

/* 和普通的迷宫问题类似只是多了一个叫传送门的东西 对于传送门的处理: 每当跑到传送门就把其余所有传送门周围的点都入队 传送门之间不花费时间并且从不是传送门的点走到传送门 也不花费时间花费时间的(好像说了句废话.) 所以判断一下 */ #include<iostream> #include<cstdio> #include<cstdlib&g...

weixin_30460489的博客 394

bfs:最短路径,传送门

题目 原题传送 分析 简单的bfs模板,注意bfs的判断都放在first之后和扩展之前。 代码 #include<bits/stdc++.h> #define MAX 305 using namespace std; int n,m; char gra[MAX][MAX]={0}; int vis[MAX][MAX]={0}; int dx[]={-1,1,0,0}; int dy[]={0,0,-1,1};//右左下上 int sx,sy; struct point { int x,y

AAAAAAJQK的博客 659

关于有传送门的BFS

关于有传送门的BFS 上次中南中期比赛的题目有个有传送门的BFS题目,这题目之前出现过一次,不过没中南的这个难,题意是在一个矩阵中从S到E,之间1的地方不能走,0的地方能走一步,消耗时间为1,2-9的地方除了能像0一样走,还能传送到相同数字的位置。之前做的那个是p能传送,这题只是传送门种类多了一些,但是解题方法是一样的。 题目链接http://acm.csu.edu.cn/Online

someday7_toi 1836

lintcode750. 传送门 bfs

Chell是Valve Corporation开发的Portal视频游戏系列中的主角。 一天,她掉进了一个迷宫。迷宫可以看作是一个大小为n x m二维字符数组。它有4种房间。'S’代表Chell从哪开始(只有一个起点)。‘E’代表迷宫的出口(当chell抵达时,她将离开迷宫,该题目可能会有多个出口)。’*‘代表这个房间Chell可以经过。’#'代表一堵墙,Chell不能经过墙。 她可以每次上下左右...

sinb妃的博客 378

走迷宫(bfs)

给你一个 n 行 m 列的二维迷宫。'S'表示起点,'T' 表示终点,'#' 表示墙壁,'.' 表示平地。你需要从 'S' 出发走到 'T',每次只能上下左右走动,并且不能走出地图的范围以及不能走到墙壁上。请你计算出走到终点需要走的最少步数。输入格式第一行输入 nnn, mmm 表示迷宫大小。(1≤n,m≤100)(1 \leq n,m \leq 100)...

zxker 2922

【教程】BFS学习笔记

今天讲的是搜矩阵图常用的方法之一——bfs 例子(已被授予主人公的名字使用权) ZZJ 进入了一个 n×mn\times mn×m 的迷宫,可执着的他表示要穿过迷宫。 ZZJ 在地图的左上角,而迷宫出口在右下角,设进入每个房间都需要 1 的时间,他在入口的地面上捡到一张迷宫地图,于是他决定计算出自己到终点最少需要时间(请思考后再往下看)。 思路: 首先,我们需要一个二维数组...

weizexin 526

【搜索】B058_LG_玉米迷宫(bfs 传送门)

一、Problem 去年秋天,奶牛们去参观了一个玉米迷宫,迷宫里有一些传送装置,可以将奶牛从一点到另一点进行瞬间转移。这些装置可以双向使用:一头奶牛可以从这个装置的起点立即到此装置的终点,同时也可以从终点出发,到达这个装置的起点。如果一头奶牛处在这个装置的起点或者终点,这头奶牛就必须使用这个装置。 玉米迷宫的外部完全被玉米田包围,除了唯一的一个出口。 这个迷宫可以表示为 N×M 的矩阵 (2 ≤ N ≤ 300; 2 ≤ M ≤ 300),矩阵中的每个元素都由以下项目中的一项组成: #:玉米,这些格子是不可

无敌兔0x01 804
上一篇: LintCode 1897: Meeting Room III (扫描线法,累加数组)
下一篇: LintCode 1031: Is Graph Bipartite? (BFS/DFS好题)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值