【888题秋招篇】剑指大厂offer第十二题,带你用数学思维秒杀米哈游校招真题-棋盘,斩获大厂年薪60wOffer

听故事学语言 · 数据结构篇 · 第五章 藏在文件里的顺序与链 数据结构篇第五章,工业章一,前四章家当的实战回门。拖动进度条为什么秒跳,MP4 登记簿记位置供直达;FAT 文件分配表,链式存储的逻辑、数组实现的身体,1977 年马克·麦克唐纳为软盘设计它;进程档案链表轮转,一头进一头出,内核偏爱链表的连接自由;浏览器后退键,教科书的双向链表对工业界的数组加游标,同一个队形,两种站位法,谁赢谁的战场。 阅读详情

更多精彩内容

这里是带你游历编程世界的Dashcoding编程社,我是Dash/北航硕士/ICPC区域赛全国排名30+/给你呈现我们眼中的世界!

256题算法特训课,帮你斩获大厂60W年薪offer

原题

米哈游校招真题棋盘

B站动画详解

问题分析

这道题目描述了一个循环棋盘的最短路径问题。棋盘由 n × m n \times m n×m 的方格组成,四周是循环连接的,即在棋盘的边缘,可以直接穿越到另一侧。例如,如果探险家位于 ( x , m ) (x, m) (x,m),他可以一步移动到 ( x , 1 ) (x, 1) (x,1),这种特殊的循环连接性使得路径计算变得复杂。题目要求我们计算从起点 A A A 到中途点 B B B,再从 B B B 到终点 C C C 的最短路径。

思路分析

在这道题目中,由于棋盘具有循环特性,因此在计算两点之间的最短距离时,需要考虑两种情况:

  • 直接距离:从一个点沿着棋盘直接移动到另一个点,不涉及循环连接。
  • 循环距离:通过棋盘的边缘进行循环连接,从而实现更短的路径。

具体来说,对于任意两个点 ( x 1 , y 1 ) (x_1, y_1) (x1​,y1​) 和 ( x 2 , y 2 ) (x_2, y_2) (x2​,y2​),我们可以分别计算横向和纵向的最短距离。横向的最短距离是以下两个值的较小者:

  • ∣ x 1 − x 2 ∣ |x_1 - x_2| ∣x1​−x2​∣ (直接横向移动的距离)
  • n − ∣ x 1 − x 2 ∣ n - |x_1 - x_2| n−∣x1​−x2​∣ (通过循环连接实现的横向距离)

类似地,纵向的最短距离是以下两个值的较小者:

  • ∣ y 1 − y 2 ∣ |y_1 - y_2| ∣y1​−y2​∣ (直接纵向移动的距离)
  • m − ∣ y 1 − y 2 ∣ m - |y_1 - y_2| m−∣y1​−y2​∣ (通过循环连接实现的纵向距离)
    最终的路径长度是横向距离和纵向距离的和。

算法实现

本题的算法核心是计算两点之间的循环距离,并通过累加每段路径的最短距离得到总路径长度。为此,我们编写了一个函数 get_dist,它用于计算两个点之间的最短距离。该函数通过比较直接距离和循环距离,选取其中较小者。

整个流程分为以下几步:

读取输入的 n n n 和 m m m 以及点 A A A、 B B B、 C C C 的坐标。
分别计算 A → B A \rightarrow B A→B 和 B → C B \rightarrow C B→C 的最短距离,并累加得到最终结果。

代码详解

标准代码程序

C++代码

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;

PII a[5];
int n, m, s;

int get_dist(PII x, PII y) {
    int x_d = min(abs(x.first - y.first), n - abs(x.first - y.first)); // 计算横向距离
    int y_d = min(abs(x.second - y.second), m - abs(x.second - y.second)); // 计算纵向距离
    return x_d + y_d; // 返回总距离
}

int main() {
    cin >> n >> m;
    for (int i = 1; i <= 3; i++) {
        cin >> a[i].first >> a[i].second;
    }
    s += get_dist(a[1], a[2]); // 计算 A 到 B 的距离
    s += get_dist(a[2], a[3]); // 计算 B 到 C 的距离
    cout << s; // 输出总距离
}

Java代码

import java.util.Scanner;

public class CircularGrid {
    static class Point {
        int x, y;
        Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }

    public static int getDistance(Point p1, Point p2, int n, int m) {
        int xDist = Math.min(Math.abs(p1.x - p2.x), n - Math.abs(p1.x - p2.x));
        int yDist = Math.min(Math.abs(p1.y - p2.y), m - Math.abs(p1.y - p2.y));
        return xDist + yDist;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), m = sc.nextInt();
        Point a = new Point(sc.nextInt(), sc.nextInt());
        Point b = new Point(sc.nextInt(), sc.nextInt());
        Point c = new Point(sc.nextInt(), sc.nextInt());
        
        int distance = getDistance(a, b, n, m) + getDistance(b, c, n, m);
        System.out.println(distance);
    }
}

Python代码

def get_distance(p1, p2, n, m):
    x_dist = min(abs(p1[0] - p2[0]), n - abs(p1[0] - p2[0]))
    y_dist = min(abs(p1[1] - p2[1]), m - abs(p1[1] - p2[1]))
    return x_dist + y_dist

def main():
    n, m = map(int, input().split())
    a = tuple(map(int, input().split()))
    b = tuple(map(int, input().split()))
    c = tuple(map(int, input().split()))

    distance = get_distance(a, b, n, m) + get_distance(b, c, n, m)
    print(distance)

if __name__ == "__main__":
    main()

Javascript代码

function getDistance(p1, p2, n, m) {
    const xDist = Math.min(Math.abs(p1[0] - p2[0]), n - Math.abs(p1[0] - p2[0]));
    const yDist = Math.min(Math.abs(p1[1] - p2[1]), m - Math.abs(p1[1] - p2[1]));
    return xDist + yDist;
}

function main() {
    const [n, m] = prompt().split(' ').map(Number);
    const a = prompt().split(' ').map(Number);
    const b = prompt().split(' ').map(Number);
    const c = prompt().split(' ').map(Number);

    const distance = getDistance(a, b, n, m) + getDistance(b, c, n, m);
    console.log(distance);
}

main();

复杂度分析

时间复杂度

计算从 A A A 到 B B B 再到 C C C 的最短路径,涉及两次距离计算:

  1. 从 A A A 到 B B B
  2. 从 B B B 到 C C C

每次距离计算的复杂度为 O ( 1 ) O(1) O(1),因为我们只是对坐标进行简单的绝对值运算和比较。整个算法的时间复杂度为 O ( 1 ) O(1) O(1)。

空间复杂度

本算法使用了常数个变量来存储坐标和计算结果,额外的空间仅用于存储坐标信息和中间结果,因此空间复杂度为 O ( 1 ) O(1) O(1)。

总结

这道题目考察的是在具有循环边界的棋盘上进行最短路径的计算问题。由于棋盘的特殊性质,即在水平方向和竖直方向上都存在循环连接,这使得从一个位置移动到另一个位置时可以选择两种路径:直接路径和穿越边界的路径。因此,问题的核心在于计算两点之间的最短距离时,如何合理利用循环边界。

解决方案通过数学方法,基于坐标差值计算最短距离。对于每个方向(横向或纵向),直接距离和跨越边界的距离取最小值,然后将两个方向的最小值相加得到总步数。由于问题规模较大( 1 ≤ n , m ≤ 1 0 9 1 \leq n, m \leq 10^9 1≤n,m≤109),算法需要在常数时间内完成计算。

整个过程分为两步:

  1. 计算从起点 A A A 到中间点 B B B 的最短距离。
  2. 计算从中间点 B B B 到终点 C C C 的最短距离。

该问题的关键是理解循环边界的特性,并且将其应用于最短路径的计算中。总体来说,问题复杂度较低,适合通过数学推导和简单的几何计算来解决。

听故事学语言 · 数据结构篇 · 第六章 栈,后进先出的盒子 数据结构篇第六章,栈。二进制短除法余数为什么要倒着读,谜底是栈;括号匹配先让计数器上场,([)] 一串让它当场折戟,混括号必须栈;逆波兰记法,1924 年卢卡谢维奇发明波兰记法,1957 年汉布林把它倒过来;一件学生时代的四则运算器文物,带着一颗时发时不发的雷,当年调了很久怎么也跑不对,病没变,变的是它发不发作;双栈直接求值与随机表达式对数器一千组零不合;最小栈一步报最小,接雨水单调栈一层一层结算;汉诺塔的调用栈真身,V 字图退役;火车进出站十四种可能,卡塔兰数;链栈与共享栈收章。 阅读详情

相关推荐

基于Java的高校学生信息管理系统的设计与实现(论文+源码)

可以对本系统的数据进行良好的封装,Java可以对不想被访问的数据进行良好的隐藏,具备平台无关性,可移植,更加可靠与安全,具备多线程支持,进行网络交互更容易。它支持本系统的B/S模式。开发效益方面,本系统一旦开发成功并且面向社会,就会让大多数的学生教师体会到便利办公的乐趣,随之促进提高本系统的使用率和经济利润,所以在经济方面,对于零成本开发且高利润的学生管理系统是可行的。学生可以在学生端进行选课,查看自己的成绩,教师可以在教师端查看所任课程的选课情况,对学生成绩进行录入,对所任的课程进行结课等操作。

2402_82389843的博客 1092

【数据结构-5】单链表的实现

单链表,具体来说是单向的、不带头的、不循环的链表。链表由一个一个节点组成,每个节点分为数据域和指针域,数据域存放数据,指针域存放下一节点的地址。这样,就可以根据指针域中的地址找到下一个节点,节点就串起来了构成了单链表。

weixin_44218929的博客 186

【PLL】分频器设计权衡:从CMOS到CML的电路实现与优化

本文深入探讨了PLL中分频器的设计权衡,比较了CMOS和CML两种电路实现的优缺点。通过实际案例分析,展示了如何在速度、功耗和噪声之间取得平衡,特别是在5G射频芯片和Wi-Fi 6E等高频应用中的优化实践。文章还提供了混合架构设计和电源噪声协同优化的实用技巧,适合电路设计工程师参考。

weixin_42521843的博客 442

pandas 深度入门:从数据结构到一份真实销售报表

本文系统讲解Pandas核心应用,从三分钟安装到完整月度报表生成,涵盖数据读取、清洗、筛选、分组聚合、表连接、透视表与时间序列等13个关键环节。强调“先看数据再动手”,掌握Series/DataFrame/Index结构本质,熟练运用loc/iloc、merge校验、agg/transform区别,通过真实案例实现高效报表自动化,告别手动Excel操作。最后提供性能优化与高频报错解决方案,助力读者快速上手,真正实现“写二十行代码,跑三秒出结果”。

信息安全领域优质创作者|操作系统领域专家 278

如何在windows电脑上搭建Linux环境(手把手教安装虚拟机软件和使用云服务器)

手把手教学如何搭建Linux环境

纪宁的博客 1万+

STM32F407+HAL库+W5500实现TCP通讯 个人项目总结

推荐阅读此博客 cv即可成功首先需要一个可以进行串口调试的工程,方便进行调试。1.在W5500官网移植库文件重点是Ethernet这个文件夹将里面的 socket.c,socket.h,wizchip_conf.c,wizchip_conf.h,还有根据W5500文件夹里的w5500.c和w5500.h移植到自己的工程里面。然后再创建一个.c和.h文件 我的叫w5500_port_hal.c 和w5500_port_hal.h 记得将.h文件链接到工程里。

a234abr的博客 2247

数据结构的基本概念和算法的初步认识

本文系统阐述数据结构与算法的基础概念,涵盖数据、数据元素、数据对象的层次关系,数据结构的三要素(逻辑结构、存储结构、数据运算),以及抽象数据类型。重点解析算法的特性与设计要求,并深入讲解时间复杂度分析的核心——大O表示法,通过“只保留最高阶项、忽略常数系数、取最坏情况”三大原则,结合实例剖析O(1)、O(n)等常见时间复杂度,揭示算法效率的本质评估方法。

ACH_YYX的博客 182

K8S 1.28.2 + Calico 3.27.3 保姆级安装避坑指南:解决节点NotReady问题

本文提供了一份详细的Kubernetes 1.28.2与Calico 3.27.3集群部署指南,重点解决节点NotReady这一常见问题。通过版本兼容性分析、精细化环境配置、kubeadm初始化参数详解及Calico Operator部署,手把手指导用户避开网络插件配置陷阱,确保集群从NotReady状态恢复健康并稳定运行。

weixin_28835583的博客 394

数据结构:9.Map和Set

有的讲解会说这里key是标识作用,这种说法其实没有太大意义,就算知道了他是标识value的作用又如何,在实际的使用过程中,我们只会根据具体的效果选择使用的方法等,不会执着于“标识”这种说法。2.由于哈希函数的设计原则太过理论,它仅仅是在认为:这些通过关键码算出来的index不同 的情况下设计的,然而这种理论化的设计原则在遇到冲突时,恰恰就出现了问题,而我们能做的,就是降低冲突率。虽然哈希表的使用过程中存在冲突,但是在实际的使用过程中,哈希表的冲突率是不高的,冲突的个数是可控的。

2602_95646088的博客 198

当LightGBM推理遇上GPU:3种替代方案性能对比(含ONNX实战代码)

本文针对LightGBM官方不支持GPU推理的性能瓶颈,深度评测了RAPIDS cuML、ONNX Runtime GPU和Triton Inference Server三种GPU加速推理替代方案。通过详尽的性能对比和实战代码,为高并发、低延迟的在线预测场景提供了清晰的选型指南,帮助工程师打破推理性能枷锁,实现显著的吞吐量提升。

salt9的博客 813

超大规模系统(千万级用户)中实现字段级权限控制

摘要:本文提出了一套分布式架构下的字段级权限优化方案,结合RBAC+ABAC混合模型与技术手段实现性能与安全的平衡。方案包括:1)权限模型优化,采用RBAC预计算基础权限与ABAC动态校验敏感字段;2)数据层优化,实现动态字段过滤与加密存储;3)多级缓存策略与预计算机制提升性能;4)分布式架构设计,通过网关校验和策略引擎集群保证扩展性。最终在千万级用户系统中实现99.9%可用性,权限校验延迟控制在50ms以内。

从技术实践立足,从项目管理方法论延伸思考 1348

Vue3 低代码移动表单设计器实战(二):缩放画布下的拖拽系统与树状级联数据结构

本文深入剖析Vue3低代码表单设计器在缩放画布下的拖拽失效问题,揭示SortableJS在CSS Transform下坐标崩溃的数学根源。通过自研独立视觉克隆壳层与逆向几何补偿算法,实现精准拖拽;采用扁平数据存储+运行时树状计算结构,解决级联依赖与深克隆难题,确保逻辑一致性与性能优化,为复杂低代码系统提供可复用的工程范式。

NanChen的博客 341

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

排序算法深度笔记(上):比较类排序的思想演进与代码实现

与。本文聚焦前者 —— 也就是通过元素间两两比较来确定相对顺序的排序算法,从最朴素的 O (n²) 基础排序,到工业级主流的 O (nlogn) 进阶排序,逐层拆解设计思想、带注释的代码实现与边界细节。当我们理解了比较排序的性能边界,也就自然引出了非比较排序的存在意义。所有代码均遵循统一的实现规范:入口函数前置空数组与单元素边界校验,基于数组原地修改,主函数附带可直接运行的测试用例,与练习代码风格完全对齐。

2401_87069538的博客 609

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

CF2283F[数据结构]

首先考虑一种暴力解法,当我们建好i之前的图后,当我们添加i的时候,区间[li,ri]中的点都会向i建边,但是这些点中,如果有某两个顶点l,r,满足l<r,那么l就可以通过r间接到达i,因此可以删除l到i的边;初始时我们令所有点放入set中,然后对于每一个i的处理,我们将集合中仍在[l,r]的范围的点弹出,并且将f设置为i,这样我们就得到了所有点的最小跳板;对于每个区间[l,r] 我们要计算这下下标中的f(v)中大于r的数目有多少个;我们令f(v)表示顶点v可到达的最小的顶点;

蒟蒻 120

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

笔记-论数据结构2

typedef 数据类型 别名return 0;typedef也经常用在结构体上:每次声明结构体变量都要写struct关键字,很麻烦,而且逻辑上也很难受,typedef可以解决这个问题。int x;int y;p.x = 5;p.y = 10;return 0;而利用typedef解决有两种解法:typedef struct 结构体名数据类型 变量名;数据类型 变量名;……}别名;数据类型 变量名;数据类型 变量名;……}别名;实际的运用int x;

fish_zzzz的博客 109

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

weixin_44218929的博客 83

【数据结构-2】顺序表的实现

线性表是一种数据结构,它分为逻辑结构和物理结构,在逻辑结构上线性表是呈线性的,数据是是连续存储的;在物理结构(物理空间)上,线性表不一定是连续存储的。线性表的实现,主要分为数组和链式结构。顺序表是线性表的一种实现方式,顺序表在逻辑结构和物理结构上都是连续的。顺序表的底层实现是数组。

weixin_44218929的博客 208

数据结构:排序

将一组无序的记录(数据元素),按照某个关键字(key)递增或递减的顺序重新排列。

2502_92937908的博客 183

Python 开发的实践:从数据结构选型到框架决策

规模多大?决定用list还是set,Pandas 还是 Polars。瓶颈在哪?I/O 密集用异步,CPU 密集用进程/自由线程,内存受限用列式与惰性执行。代价是什么?消除手动维护窗口的出错面,TaskGroup消除失败任务不被取消的泄漏,消除 N+1,Protocol消除为类型约束而引入的继承层级——每个选择都在消除某类代价,同时也引入新的约束。能回答这三个问题,比记住更多 API 更有用。愿你我都能在各自的领域里不断成长,勇敢追求梦想,同时也保持对世界的好奇与善意!

weixin_45809780的博客 375

头歌 数据结构——C&C++线性表实训

本系列任务围绕线性表的链式实现,依次完成顺序构建、逆序构建、排序插入、查找、删除、求长度及栈、队列、集合等应用。通过动态内存分配与指针操作,掌握单链表的基本操作与实际应用,涵盖插入、删除、遍历、搜索等核心功能,最终实现数据结构在典型场景中的灵活运用。

一名敲代码的苦13程序员 238

CDGA DMBOK 第5章——数据建模和设计:如何将业务需求转化为规范的数据结构

本章系统阐述数据建模与设计的核心方法,强调将业务需求转化为规范数据结构的全过程。重点涵盖数据模型三层次(概念、逻辑、物理)、实体关系模型(ER)及主键、外键等核心要素,深入解析第一至第三范式,阐明规范化在消除冗余、保障数据一致性的关键作用,并介绍反规范化在性能优化中的合理应用。通过“概念看业务、逻辑看结构、物理看实现”的逻辑框架,实现从需求到数据库落地的完整闭环。

积跬步,慕至千里的博客 306

数据结构第三课:单链表与双向链表

单链表是基于结点的非连续存储结构,由数据域和指针域组成,逻辑上连续但物理上可不连续。其核心优势在于动态增删高效,适合频繁插入删除场景;相较顺序表,虽有指针开销且访问需遍历,但灵活性更高。常见算法包括反转、中间节点查找、合并有序链表及环检测等。双向链表通过前后指针提升操作效率,实际应用中常采用带头循环双向链表结构。

2503_93549121的博客 202

数据结构——图的基础

图是由顶点集和边集构成的非线性数据结构,用于描述多对多关系。根据边的方向分为有向图与无向图,按连通性分为连通图与非连通图,按边是否带权分为有权图(网)与无权图。关键术语包括:简单图(无重边、自环)、完全图(边数最多)、稀疏/稠密图、路径、回路、子图、连通分量(极大连通子图)、强连通分量及生成树(包含所有顶点的极小连通子图,不唯一)。

2401_89246663的博客 170

数据结构:栈和队列

实现,栈顶设在链表头部(头插法),这样 push/pop 都是 O(1)。指向的是"下一个可插入位置",不是最后一个元素。:中缀转后缀(逆波兰表达式),用两个栈(操作数栈 + 运算符栈)。在队尾(rear)插入,在队头(front)删除。:链栈不会栈满(除非内存耗尽),适合元素数量不确定的场景。进行插入(入栈 push)和删除(出栈 pop)操作。:遇左括号入栈,遇右括号弹栈比对。:为了区分"队空"和"队满",通常。:只允许一端插入,两端删除。:只允许一端删除,两端插入。:排队买票,先来先服务。

2502_92937908的博客 337

数据结构之图论基础——从定义到常用术语

本文系统梳理图论核心知识点:从数据关系递进引出图的多对多特性,定义图为G=(V,E),强调顶点集非空;分类为有向/无向、有权/无权、连通/非连通;详解九大高频术语——完全图、稀疏/稠密图、权与网、邻接、度(含握手定理)、路径、子图、连通分量与生成树,并总结考研/面试必背公式与易错点,突出“边数计算”与“极大/极小”辨析,助力高效备考。

qq_34097230的博客 356
上一篇: 【蓝桥杯冲刺省一,省一看这些就够了-C++版本】蓝桥杯C++字符串及相关练习题
下一篇: 【蓝桥杯冲刺省一,省一看这些就够了-C++版本】蓝桥杯C++STL及相关练习题
Dashcoding编程设
博客等级 码龄2年 566粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值