LintCode 题解丨大厂真题:骑士的最短路线

简介: LintCode 题解丨大厂真题:骑士的最短路线

给定骑士在棋盘上的 ​初始​ 位置(一个2进制矩阵 ​0​ 表示空 ​1​ 表示有障碍物),找到到达 ​终点​ 的最短路线,返回路线的长度。如果骑士不能到达则返回 ​-1​ 。

起点跟终点必定为空.
骑士不能碰到障碍物.
路径长度指骑士走的步数.
在线评测地址:
LintCode 领扣

说明

如果骑士的位置为 (x,y),他下一步可以到达以下这些位置:

(x + 1, y + 2)
(x + 1, y - 2)
(x - 1, y + 2)
(x - 1, y - 2)
(x + 2, y + 1)
(x + 2, y - 1)
(x - 2, y + 1)
(x - 2, y - 1)
样例

例1:

输入:
[[0,0,0],
[0,0,0],
[0,0,0]]
source = [2, 0] destination = [2, 2]
输出: 2
解释:
[2,0]->[0,1]->[2,2]
例2:

输入:
[[0,1,0],
[0,0,1],
[0,0,0]]
source = [2, 0] destination = [2, 2]
输出:-1
算法:BFS

朴素​BFS​搜搜最短路,BFS概括来说就是像雷达一样,一层一层进行寻找目标点。当找到目标点后进行回溯。从而找到最佳路径。也就是说每走一步都要找到到达该点的最短的路径,最终得到到达所有点的最短路径,这题每一次的下一步做了规定,按照日字形跳到下一步。

根据下一跳位置建立方向数组
​dx=[1, 1, 2, 2, -1, -1, -2, -2]​
​dy=[2, -2, 1, -1, 2, -2, 1, -1]​
遍历八个方向,进行搜索
用​grid​数组标注是否访问过某点
注意判断下一跳的位置是否越界
复杂度分析

时间复杂度​O(n*m)​
最多跑一边图 n为图的行数,m为图的列数,最多跑一边图,即n*m
空间复杂度​O(n*m)​
所有点的信息 n为图的行数,m为图的列数
public class Solution {

/**
 * @param grid: a chessboard included 0 (false) and 1 (true)
 * @param source: a point
 * @param destination: a point
 * @return: the shortest path 
 */
public int shortestPath(boolean[][] grid, Point source, Point destination) {
    int n = grid.length,m = grid[0].length;
    if (n == 0 || m == 0) {
        return -1;
    }
    
    int[] dx = {1, 1, 2, 2, -1, -1, -2, -2};
    int[] dy = {2, -2, 1, -1, 2, -2, 1, -1};
    Queue<Point> queue = new LinkedList<>();
    queue.offer(source);
    grid[source.x][source.y] = true;
    int ans = 0;
    
    while (!queue.isEmpty()) {
        int size = queue.size();
        for (int k = 0; k < size; k++) {
            Point cur = queue.poll();
            //到达终点,返回距离
            if (cur.x == destination.x && cur.y == destination.y)  {
                return ans;
            }
            for (int i = 0; i < 8; i++) {
                Point next = new Point (
                    cur.x + dx[i],
                    cur.y + dy[i]
                );
                //判断下一条可否到达
                if (is_in_bound(next,n,m) && grid[next.x][next.y] == false) {
                    queue.offer(next);
                    grid[next.x][next.y] = true;
                }
            }
        }
        ans++;
    }
    return -1;
}
//判断是否越界
private boolean is_in_bound(Point next,int n,int m) {
    return 0 <= next.x && next.x < n && 0 <= next.y && next.y < m;
}

}
更多题解参考:九章算法官网

相关文章
|
Linux 网络安全 Android开发
振南技术干货集:各大平台串口调试软件大赏(1)
振南技术干货集:各大平台串口调试软件大赏(1)
|
C# 前端开发
WPF - 图形设计器(Diagram Designer)
原文:WPF - 图形设计器(Diagram Designer)   OpenExpressApp计划中包括建模工具,计划是采用MetaEdit+模型来作为元模型,使用codeproject的《WPF Diagram Designer》一系列文章来做为设计器实现参考,本篇介绍一下codeprojcet的这四个文章,推荐给对图形设计器感兴趣的人去看看,通过WPF的模板功能和其他功能可以很方便的设计出图形编辑器。
4125 0
|
人工智能 自然语言处理 算法
阿里云智能客服知识运营白皮书
        阿里云智能客服知识运营白皮书的撰写,是协调包括算法工程师、开发工程师、产品设计师、AIT 人工智能训练师人员等多角色,将技术理论基础和实际实践经验进行结合,形成业内首部智能客服知识运营白皮书。白皮书以阿里云智能客服系统为应用标的,面向智能客服中的知识定义、知识应用、知识梳理方法三大环节进行描述和说明,希望为智能客服领域的知识应用提供具备指导性意义的方法论。一直以来,智能客服领域的知
973 1
阿里云智能客服知识运营白皮书
|
SQL 弹性计算 关系型数据库
MCP我知道:手搓代码学原理到应用,附讲解视频
MCP火爆异常,目前大量资料介绍了基本概念,与LLM联动这块通常是讲如何集成在Claude、Cursor这些系统,隐藏了其底层细节原理。本文将从0编写client、Server代码、搭建QwQ-32B大模型、接入云数据库,讲解通过联动外围工具来解决LLM“知识茧房”问题。最后总结并展望了MCP未来的发展。
1656 14
MCP我知道:手搓代码学原理到应用,附讲解视频
|
并行计算 监控 网络协议
西门子PLC常用的通讯接口和通讯协议有哪些?RS232、RS485、PPI、MPI、Modbus、Profibus、Uss的特点
西门子PLC常用的通讯接口和通讯协议有哪些?RS232、RS485、PPI、MPI、Modbus、Profibus、Uss的特点
西门子PLC常用的通讯接口和通讯协议有哪些?RS232、RS485、PPI、MPI、Modbus、Profibus、Uss的特点
|
C++ 开发者 缓存
面向 C++ 的现代 CMake 教程(四)(1)
面向 C++ 的现代 CMake 教程(四)
459 0
|
传感器 人工智能 算法
逐渐走向实用,揭秘世界顶尖人形机器人ASIMO
从《列子·汤问》传说中以假乱真的舞者到现在科幻作品中的各种类人机器人,人类从没停止过对创造类人机器的幻想。而随着机器人学、人工智能和计算科学等科学技术的发展,人类长久以来的梦想正在逐渐成为现实,我们的生活中也渐渐开始有了它们的身影。
2270 0
逐渐走向实用,揭秘世界顶尖人形机器人ASIMO
|
存储 容灾 双11
|
传感器 机器学习/深度学习 编解码
IROS2022 | 训练数据不够?那就学习模拟真实的激光雷达!
模拟逼真的传感器是自动驾驶系统数据生成中的一个挑战,通常涉及精心制作的传感器设计、场景特性和物理建模。为了缓解这一问题,论文引入了一种用于真实激光雷达传感器的数据驱动模拟的管道!!论文提出了一个模型,该模型直接从真实数据集学习RGB图像和相应的激光雷达特征(如光线下降或perpoint强度)之间的映射。结果表明,该模型可以学习如何对真实效果进行编码,例如透明表面上的落点或反射材料上的高强度反射。当应用于现成模拟器软件提供的简单的光线投射点云时,论文的模型通过预测强度和基于场景外观去除点云来增强数据,以匹配真实的激光雷达传感器。
IROS2022 | 训练数据不够?那就学习模拟真实的激光雷达!
|
小程序 安全 API
微信支付-全面详解(学习总结---从入门到深化)(上)
微信支付(https://pay.weixin.qq.com)是腾讯集团旗下中国领先 的第三方支付平台,一直致力于为用户和企业提供安全、便捷、专业的在线支付服务。
1758 0
微信支付-全面详解(学习总结---从入门到深化)(上)