完整教程:LeetCode 面试题 16.22. 兰顿蚂蚁

news/2026/1/18 18:04:09/文章来源:https://www.cnblogs.com/yangykaifa/p/19498881

题目链接

面试题 16.22. 兰顿蚂蚁

一只蚂蚁坐在由白色和黑色方格构成的无限网格上。开始时,网格全白,蚂蚁面向右侧。每行走一步,蚂蚁执行以下操作。

(1) 如果在白色方格上,则翻转方格的颜色,向右(顺时针)转 90 度,并向前移动一个单位。
(2) 如果在黑色方格上,则翻转方格的颜色,向左(逆时针方向)转 90 度,并向前移动一个单位。

编写程序来模拟蚂蚁执行的前 K 个动作,并返回最终的网格。

网格由数组表示,每个元素是一个字符串,代表网格中的一行,黑色方格由 'X' 表示,白色方格由 '_' 表示,蚂蚁所在的位置由 'L', 'U', 'R', 'D' 表示,分别表示蚂蚁 左、上、右、下 的朝向。只需要返回能够包含蚂蚁走过的所有方格的最小矩形。

示例 1:

输入:0
输出:["R"]

示例 2:

输入:2
输出:
["_X","LX"
]

示例 3:

输入:5
输出:
["_U","X_","XX"
]

说明:

  • K <= 100000

思路解析(稀疏存储 + 模拟 + 动态边界)

1. 为什么不能开一个“大棋盘”?

结论:

只需要记录“黑色格子”的集合,白色格子默认存在但不存储。


2. 状态设计

我们需要维护:

  1. 蚂蚁的位置:(x, y)

    • 初始位置可以设为 (0, 0)
  2. 蚂蚁的方向:
    约定方向编码为:

    • 0: 上 (U)
    • 1: 右 (R)
    • 2: 下 (D)
    • 3: 左 (L)

    初始方向为 右 ®,即 dir = 1

  3. 黑色格子集合:

    可以用 unordered_set<long long> 存储,每个格子坐标 (x, y) 编码成一个 long long

    auto encode = [](int x, int y) -> unsigned long long {
    return ((unsigned long long)(unsigned int)x << 32) | (unsigned long long)(unsigned int)y;
    };

    这样就可以 O(1) 平均时间判断一个格子是否是黑色。

    注意 int 符号拓展的问题。

  4. 已访问区域的最小矩形边界:

    • minX, maxX, minY, maxY
    • 每次蚂蚁“站在某个格子上”时,把这个格子纳入边界中:
      • 模拟过程中:每一步操作前,将当前 (x, y) 更新到边界;
      • 模拟结束后,再把“最终位置”也更新到边界。

    题目中要求返回能包含蚂蚁走过所有方格的最小矩形,用这个四元组就可以定位最终输出的矩形大小。


3. 每一步如何模拟?

当前蚂蚁在 (x, y),方向为 dir

  1. 看当前格子颜色:

    • 如果不在黑色集合中:它是 白色
    • 如果在黑色集合中:它是 黑色
  2. 如果是白色

    • 把它翻成黑色:把 (x, y) 加入集合
    • 右转:dir = (dir + 1) % 4
  3. 如果是黑色

    • 把它翻成白色:把 (x, y) 从集合中删掉
    • 左转:dir = (dir + 3) % 4(相当于 -1,注意要加 4 再取模或直接 +3 再模)
  4. 按新的方向前进一步:

    /* 顺时针方向:0 = 上, 1 = 右, 2 = 下, 3 = 左
    +----+----+----+----+
    | \  | y0 | y1 | y2 |
    +----+----+----+----+
    | x0 |    |    |    |
    +----+----+----+----+
    | x1 |    |    |    |
    +----+----+----+----+
    | x2 |    |    |    |
    +----+----+----+----+
    */
    int dx[4] = {-1, 0, 1, 0};
    int dy[4] = {0, 1, 0, -1};

循环执行 K 次即可。


4. 如何构造最后的输出网格?

我们现在有:

  • 黑色格子集合 black
  • 蚂蚁最终位置 (x, y) & 方向 dir
  • 覆盖所有走过格子的边界 minX, maxX, minY, maxY

构造网格:

  1. 网格的高度/宽度:

    int rows = maxX - minX + 1;
    int cols = maxY - minY + 1;
  2. 初始化为全白 '_'

    vector<string> res(rows, string(cols, '_'));
  3. 把所有黑色格子标成 'X'

    for(auto &key : black) {
    int bx = (int)(key >> 32);
    int by = (int)(key & 0xffffffff);
    res[bx - minX][by - minY] = 'X';
    }

    遍历黑色集合中的每个 (bx, by),在 ans[row][col] = 'X'

  4. 最后填蚂蚁所在的位置,覆盖之前可能填的 'X'

    res[x - minX][y - minY] = "URDL"[dir];

C++ 代码

class Solution {
public:
vector<string> printKMoves(int K) {// 把 (x,y) 编码成一个 unsigned long long// 先将 int:x,y 转换为 unsigned int 避免有符号数符号拓展污染高位auto encode = [](int x, int y) -> unsigned long long{return ((unsigned long long)(unsigned int)x << 32) ^ (unsigned long long)(unsigned int)y;};// 用 hash set 存黑色格子(白色默认不存)unordered_set<unsigned long long> black;black.reserve(K * 2); // 预留两倍空间减少扩容次数// 方向:0 = 上, 1 = 右, 2 = 下, 3 = 左// (0,0) -----> x轴// |// |// ↓// y轴int dx[4] = {0, 1, 0, -1};int dy[4] = {-1, 0, 1, 0};int x = 0, y = 0; // 当前位置int dir = 1; // 初始向右// 边界(用来计算最终矩形大小)int minX = 0, maxX = 0;int minY = 0, maxY = 0;// 模拟 K 步for (int i = 0; i < K; ++i) {unsigned long long key = encode(x, y);bool isBlack = (black.count(key) > 0);if (isBlack) {// 黑色:变白 + 左转black.erase(key);dir = (dir - 1 + 4) % 4; // +4 避免出现负数} else {// 白色:变黑 + 右转black.insert(key);dir = (dir + 1) % 4;}// 前进x += dx[dir];y += dy[dir];minX = min(minX, x);maxX = max(maxX, x);minY = min(minY, y);maxY = max(maxY, y);}int rows = maxY - minY + 1;int cols = maxX - minX + 1;// 创建全白画布vector<string> ans(rows, string(cols, '_'));// 填黑格子for (auto &key : black) {int bx = (int)(key >> 32);int by = (int)(key & 0xffffffff);int row = by - minY;  // y 对应行int col = bx - minX;  // x 对应列ans[row][col] = 'X';}// 放蚂蚁ans[y - minY][x - minX] = "URDL"[dir];return ans;}};

时间 & 空间复杂度分析

设步数为 K,最终最小矩形为 rows × cols

  1. 模拟过程

    • 每一步只做:
      • 在 hash 表中插入/删除/查询一次(均摊 O(1))
      • 若干常数操作
    • 总时间:O(K)(均摊)
  2. 构造输出网格

    • 初始化网格:O(rows × cols)
    • 填黑色格子:至多访问 black.size() 个格子,black.size() ≤ K,所以 O(K)
    • 综合:O(rows × cols + K)

在这道题给定的数据范围下,Langton 蚂蚁实际走过区域的面积相对 K 是线性的量级,因此整体时间可以认为是 O(K)

  1. 空间复杂度
    • 黑色格子集合:最多 K 个位置 → O(K)
    • 输出网格:O(rows × cols),在本题约为 O(K)
    • 综合空间复杂度:O(K)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三十三周 学习周报

摘要今日学习聚焦Fluent文件管理&#xff1a;掌握.msh、.cas、.dat核心文件作用&#xff0c;并对比.gz与.h5压缩格式的优缺点&#xff0c;为高效仿真文件存储提供选择依据。AbstractTodays learning focuses on Fluent file management: understanding the roles of core files…

213_尚硅谷_接口介绍和快速入门

213_尚硅谷_接口介绍和快速入门1.usb接口调用案例_实际物理接口 2.usb接口调用案例 3.usb接口调用案例_运行结果 4.手机接口案例分解 5.相机接口案例分解 6.电脑接口案例分解

【车载开发系列】AES-CMAC算法基础

【车载开发系列】AES-CMAC算法基础 【车载开发系列】AES-CMAC算法基础【车载开发系列】AES-CMAC算法基础一. 什么是AES二. AES密钥长度三. AES128算法特点四. AES实施步骤五. 算法应用六. 个人总结一. 什么是AES AES&#xff08;Advanced Encryption Standard&#xff09;是对…

2026国产时序数据库风云录:金仓“融合多模”架构异军突起

> 摘要&#xff1a;进入2026年&#xff0c;在“数字中国”与工业物联网浪潮的强劲推动下&#xff0c;国产时序数据库市场持续繁荣&#xff0c;竞争格局日趋清晰。本文将对当前主流的国产时序数据库进行梳理盘点&#xff0c;并特别聚焦于金仓数据库&#xff08;Kingbase&…

搭建 dnsmasq 服务器

dnsmasq 是一个轻量级的 DNS + DHCP + TFTP 集成服务,主要面向:小型网络 虚拟化环境 实验环境 容器 / K8s / OpenStack / libvirt 本地 DNS 缓存与域名解析它的核心特点是:配置简单、占用资源极低、启动快 dnsmasq …

Python+django的基于人脸识别的学生考勤请假选课软件系统

目录基于人脸识别的学生考勤请假选课系统&#xff08;PythonDjango&#xff09;开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;基于人脸识别的学生考勤请假选课系统&#xff08;PythonDjang…

【车载开发系列】安全算法与安全访问

【车载开发系列】安全算法与安全访问 【车载开发系列】安全算法与安全访问【车载开发系列】安全算法与安全访问一. 网络传输编码1&#xff09;Base64编码2&#xff09;十六进制编码二.四种加密算法1&#xff09;消息摘要算法&#xff08;摘要算法&#xff0c;哈希算法&#xff…

苍穹外卖学习 - day2

写在开头: 佛了,每次想起要写日记的时候,忙来忙去结果忘记写了,算了,先堆一些吧。目录: @目录写在开头:目录:今日完成今日收获12、redis基础今日完成实现了公共字段的自动填充,使用AOP切面的知识,在进行某系…

2025年市面上诚信的多媒体讲台电教桌公司排行,厂区监控杆/防雨套/化验室操作台厂家联系电话 - 品牌推荐师

行业洞察:多媒体讲台电教桌市场的竞争与机遇 随着教育信息化、智能化需求的持续攀升,多媒体讲台电教桌作为教学场景的核心设备,正经历从单一功能向集成化、定制化、智能化的深度转型。市场数据显示,2024年国内多媒…

P_X(x), P(X=1) 的区别;概率度量vs.概率分布

PX(x)P_X(x)PX​(x), P(X1)P(X1)P(X1) 的区别&#xff1b;概率度量vs.概率分布让我们用现实比喻来理解这个“简化计算”的概念。 比喻1&#xff1a;考试成绩统计 原始世界Ω&#xff1a;全班50个学生的完整试卷&#xff08;每道题的具体答案&#xff09; 张三的卷子李四的卷子王…

Python+django的基于学生行为的在线教育 学习选课成绩分析系统可视化统计图没有

目录基于学生行为的在线教育学习选课成绩分析系统可视化统计图摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;基于学生行为的在线教育学习选课成绩分析系统可视化统计图摘要 该系统采用…

论文卡壳不用愁:AI工具快速生成内容并优化重复率

AI工具性能速览表 工具名称 核心功能 处理时间 AI生成率控制 适配检测平台 askpaper 降AIGC率降重同步 20分钟 个位数 知网/格子达/维普 秒篇 AI痕迹深度弱化 20分钟 个位数 知网/格子达/维普 aicheck 全学科初稿生成 20-30分钟 低水平 - aibiye 文献智能…

评估智能体能力的标准化基准测试

一、引言 随着人工智能技术的飞速迭代&#xff0c;智能体&#xff08;Agent&#xff09;已从单一功能模型演进为具备感知、决策、执行、协作等综合能力的自主系统&#xff0c;广泛渗透到智能客服、自动驾驶、工业质检、科研辅助等多个领域。不同技术路线、应用场景下的智能体层…

折腾笔记[42]-使用标准数据集测试30b模型编程能力

使用标准数据集测试30b-a3b:q8模型编程能力.摘要 使用标准数据集测试30b-a3b:q8模型编程能力. 简介 HumanEval数据集简介 [https://gitcode.com/gh_mirrors/hu/human-eval]This is an evaluation harness for the Huma…

本科毕业论文流程图制作方法

良功绘图网站 (https://www.lghuitu.com ) 本科毕业论文流程图是学术研究过程的可视化呈现&#xff0c;其核心价值在于将复杂的论文撰写流程拆解为清晰、有序的节点&#xff0c;帮助学生梳理研究逻辑、规避流程漏洞&#xff0c;同时也便于指导教师快速把握研究框架、提供针对性…

高效论文撰写:AI技术驱动的7大格式规范网站

工具快速对比排名&#xff08;前7推荐&#xff09; 工具名称 核心功能亮点 处理时间 适配平台 aibiye 学生/编辑双模式降AIGC 1分钟 知网、万方等 aicheck AI痕迹精准弱化查重一体 ~20分钟 知网、格子达、维普 askpaper AIGC率个位数优化 ~20分钟 高校检测规则通…

AI开发中的版本控制与实验复现难题

一、AI开发的特殊性&#xff1a;版本控制与实验复现的核心挑战 在人工智能开发领域&#xff0c;尤其是深度学习项目中&#xff0c;版本控制与实验复现始终是困扰开发者的核心难题。与传统软件开发相比&#xff0c;AI开发的资产构成更复杂&#xff0c;除了代码之外&#xff0c;还…

AI助力论文创作:7个专业网站满足格式与LaTeX需求

工具快速对比排名&#xff08;前7推荐&#xff09; 工具名称 核心功能亮点 处理时间 适配平台 aibiye 学生/编辑双模式降AIGC 1分钟 知网、万方等 aicheck AI痕迹精准弱化查重一体 ~20分钟 知网、格子达、维普 askpaper AIGC率个位数优化 ~20分钟 高校检测规则通…

研究生开题报告框架图绘制工具

良功绘图网站 (https://www.lghuitu.com ) 研究生开题报告是学术研究的重要起点&#xff0c;其框架图的质量直接影响研究思路的清晰度和评审效率。一份逻辑严谨、结构清晰的框架图&#xff0c;能帮助导师快速把握研究核心、指出优化方向&#xff0c;也能让研究生在后续撰写过程…

轻量级高效模型崛起:性能与效率的完美平衡

一、轻量级模型崛起的背景与核心动因 在人工智能技术迅猛发展的浪潮中&#xff0c;深度学习模型的规模曾一度成为衡量性能的重要指标。从早期参数量百万级的基础模型&#xff0c;到如今千亿、万亿参数的大型语言模型与多模态模型&#xff0c;算力驱动下的模型规模扩张确实带来了…