[蓝桥杯]兰顿蚂蚁
兰顿蚂蚁
题目描述
兰顿蚂蚁,是于 1986 年,由克里斯·兰顿提出来的,属于细胞自动机的一种。
平面上的正方形格子被填上黑色或白色。在其中一格正方形内有一只"蚂蚁"。
蚂蚁的头部朝向为:上下左右其中一方。
蚂蚁的移动规则十分简单:
若蚂蚁在黑格,右转 90 度,将该格改为白格,并向前移一格;
若蚂蚁在白格,左转 90 度,将该格改为黑格,并向前移一格。
规则虽然简单,蚂蚁的行为却十分复杂。刚刚开始时留下的路线都会有接近对称,像是会重复,但不论起始状态如何,蚂蚁经过漫长的混乱活动后,会开辟出一条规则的"高速公路"。
蚂蚁的路线是很难事先预测的。
你的任务是根据初始状态,用计算机模拟兰顿蚂蚁在第 n 步行走后所处的位置。
输入描述
输入数据的第一行是 m,nm,n 两个整数 (3<m,n<100)(3<m,n<100),表示正方形格子的行数和列数。
接下来是 mm 行数据。
每行数据为 nn 个被空格分开的数字。0 表示白格,1 表示黑格。
接下来是一行数据:x,y,s,kx,y,s,k, 其中 x,yx,y 为整数,表示蚂蚁所在行号和列号(行号从上到下增长,列号从左到右增长,都是从 0 开始编号)。ss 是一个大写字母,表示蚂蚁头的朝向,我们约定:上下左右分别用:U D L R 表示。kk 表示蚂蚁走的步数。
输出描述
输出数据为两个空格分开的整数 p,qp,q, 分别表示蚂蚁在 kk 步后,所处格子的行号和列号。
输入输出样例
示例
输入
5 6
0 0 0 0 0 0
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
2 3 L 5
输出
1 3
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
总通过次数: 854 | 总提交次数: 917 | 通过率: 93.1%
难度: 困难 标签: 2014, 模拟, 省赛
算法思路
兰顿蚂蚁是一种基于细胞自动机的模型,其行为规则简单但能产生复杂的行为模式。核心思路是模拟蚂蚁在网格上的移动过程:
- 状态判断:根据当前所在格子的颜色(黑/白)决定转向规则
- 转向规则:
- 黑格 → 右转90°
- 白格 → 左转90°
- 颜色翻转:翻转当前格子颜色(黑→白,白→黑)
- 位置移动:根据新方向前进一格
通过循环执行上述操作K次,最终确定蚂蚁位置
算法过程演示
完整C++代码
#include <iostream>
#include <vector>
using namespace std;int main() {// 输入网格尺寸int m, n;cin >> m >> n;// 创建并初始化网格 (0=白格, 1=黑格)vector<vector<int>> grid(m, vector<int>(n));for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {cin >> grid[i][j];}}// 输入蚂蚁初始状态int x, y, k;char s;cin >> x >> y >> s >> k;// 方向映射: U=0, R=1, D=2, L=3int dir;if (s == 'U') dir = 0;else if (s == 'R') dir = 1;else if (s == 'D') dir = 2;else if (s == 'L') dir = 3;// 模拟蚂蚁移动while (k--) {// 根据当前格子颜色转向if (grid[x][y] == 0) { // 白格→左转dir = (dir + 3) % 4; // +3 等效于逆时针90°} else { // 黑格→右转dir = (dir + 1) % 4; // +1 等效于顺时针90°}// 翻转当前格子颜色grid[x][y] = 1 - grid[x][y];// 根据新方向移动switch (dir) {case 0: x--; break; // 上case 1: y++; break; // 右case 2: x++; break; // 下case 3: y--; break; // 左}}// 输出最终位置cout << x << " " << y;return 0;
}
代码解析
-
网格初始化(第11-17行)
- 使用
vector
动态创建m×n网格 - 0表示白格,1表示黑格
- 使用
-
方向映射(第23-28行)
- 将字符方向(U/R/D/L)转换为数字(0/1/2/3)
- 便于数学计算转向角度
-
核心移动逻辑(第31-45行)
(dir + 3) % 4
:实现左转90°(逆时针)(dir + 1) % 4
:实现右转90°(顺时针)1 - grid[x][y]
:快速翻转格子颜色
-
边界处理
- 题目保证移动不越界,无需额外检查
实例验证
输入:
5 6
0 0 0 0 0 0
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
2 3 L 5
模拟过程:
步数 | 位置(x,y) | 当前颜色 | 新方向 | 移动后位置 |
---|---|---|---|---|
初始 | (2,3) | 白(0) | ↓ (D) | (3,3) |
1 | (3,3) | 白(0) | → (R) | (3,4) |
2 | (3,4) | 白(0) | ↑ (U) | (2,4) |
3 | (2,4) | 白(0) | ← (L) | (2,3) |
4 | (2,3) | 黑(1) | ↑ (U) | (1,3) |
输出:1 3
✅ 符合预期
注意事项
-
方向映射一致性:
- 必须确保方向数字与移动操作的对应关系正确
- 错误映射会导致移动方向混乱
3
-
颜色翻转时机:
- 必须在移动前翻转当前格子颜色
- 顺序错误会导致状态不一致
6
-
边界风险:
- 虽然题目保证不越界,但可添加防护:
// 在switch后添加边界检查 x = max(0, min(x, m-1)); y = max(0, min(y, n-1));
-
大K值优化:
- 当K>10⁶时,可考虑周期性检测
- 记录状态(x,y,dir,gridHash)减少重复计算
8
测试用例设计
测试类型 | 输入样例 | 预期输出 | 验证点 |
---|---|---|---|
最小网格 | 3 3\n0 0 0\n0 0 0\n0 0 0\n1 1 U 1 | 0 1 | 基本功能 |
边界移动 | 3 3\n1 1 1\n1 1 1\n1 1 1\n0 0 D 3 | 2 0 | 边界处理 |
颜色翻转 | 1 1\n1\n0 0 U 2 | 0 0 | 颜色翻转正确性 |
最大步数(K=100000) | 100×100全白网格+50 50 R 100000 | 坐标验证 | 性能(需<0.5s) |
方向组合 | 3 3\n0 1 0\n1 0 1\n0 1 0\n1 1 U 4 | 0 1 | 复杂转向逻辑 |
优化建议
-
内存优化:
// 使用bitset压缩存储 #include <bitset> vector<vector<bitset<1>>> grid(m, vector<bitset<1>>(n));
- 减少75%内存占用(适用于大网格)
-
循环展开:
// 每4步作为一组处理 while (k >= 4) {// 处理4步移动k -= 4; }
-
SIMD并行:
- 使用AVX指令并行处理多个格子颜色翻转
- 适用于需要同时模拟多只蚂蚁的场景
-
状态缓存:
unordered_map<string, int> stateMap; string state = to_string(x)+","+to_string(y)+","+to_string(dir)+",";
相关文章:

[蓝桥杯]兰顿蚂蚁
兰顿蚂蚁 题目描述 兰顿蚂蚁,是于 1986 年,由克里斯兰顿提出来的,属于细胞自动机的一种。 平面上的正方形格子被填上黑色或白色。在其中一格正方形内有一只"蚂蚁"。 蚂蚁的头部朝向为:上下左右其中一方。 蚂蚁的移…...

使用 Python 构建并调用 ComfyUI 图像生成 API:完整实战指南
快速打造你自己的本地 AI 图像生成服务,支持 Web 前端一键调用! 📌 前言 在 AIGC 快速发展的今天,ComfyUI 作为一款模块化、节点式的图像生成界面,备受开发者青睐。但默认情况下,ComfyUI 主要通过界面交互…...

嵌入式学习笔记-freeRTOS taskENTER_CRITICAL(_FROM_ISR)跟taskEXIT_CRITICAL(_FROM_ISR)函数解析
一 函数taskENTER_CRITICAL,taskEXIT_CRITICAL 函数taskENTER_CRITICAL最终实现如下: 第①处按照系统设定的configMAX_SYSCALL_INTERRUPT_PRIORITY值对中断进行屏蔽 第②处调用一次自增一次 第③处检查中断状态寄存器位,如果有任何中断位置…...
Unity基础-数学向量
Unity基础-数学向量 二、向量相关用法 概述 向量在Unity游戏开发中扮演着重要角色,用于表示位置、方向、速度等。Unity提供了Vector2、Vector3等结构体来处理向量运算。 1. 向量基础操作 1.1 向量创建和访问 // 创建向量 Vector3 position new Vector3(1, 2,…...
【华为云Astro-服务编排】服务编排中图元的使用与配置
目录 子服务编排图元 子服务编排图元的作用 如何使用子服务编排图元 脚本图元 脚本图元的作用 如何使用脚本图元 记录创建图元 记录创建图元的作用 如何使用记录创建图元 记录删除图元 记录删除图元的作用 如何使用记录删除图元 记录查询图元 记录查询图元的作用…...

1panel面板中部署SpringBoot和Vue前后端分离系统 【图文教程】
1panel面板中部署SpringBoot和Vue前后端分离系统 一,1panel面板部署二,安装OpenResty三,安装MySQL,Redis等Spring boot 运行依赖环境四,SpringBoot 应用配置及打包部署配置打包部署 五 ,前端VUE应用配置打包…...
C++.OpenGL (7/64)摄像机(Camera)
摄像机(Camera) 摄像机系统核心组件 #mermaid-svg-lmysTXAyyzKytiOC {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lmysTXAyyzKytiOC .error-icon{fill:#552222;}#mermaid-svg-lmysTXAyyzKytiOC .error-text{fi…...
使用xdocreport导出word
之前java总用freemaker进行导出,但是改xml实在是太繁琐了,这次找了另一个工具进行体验. 一、简单导出 pom引入 <dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.core</arti…...
青少年编程与数学 01-011 系统软件简介 05 macOS操作系统
青少年编程与数学 01-011 系统软件简介 05 macOS操作系统 一、历史发展(一)经典 Mac OS(1984-2001)(二)Mac OS X(2001-2016)(三)macOS(2016-至今&…...
Python打卡训练营学习记录Day43
作业: kaggle找到一个图像数据集,用cnn网络进行训练并且用grad-cam做可视化 进阶:并拆分成多个文件 从谷歌图片中拍摄的 10 种不同类别的动物图片 数据预处理 import os from torchvision import datasets, transforms from torch.utils…...

【Android基础回顾】二:handler消息机制
Android 的 Handler 机制 是 Android 应用中实现线程间通信、任务调度、消息分发的核心机制之一,它基于 消息队列(MessageQueue) 消息循环(Looper) 消息处理器(Handler) 组成。 1 handler的使用…...

每日Prompt:每天上班的状态
提示词 一个穿着清朝官服的僵尸脸上贴着符纸,在电脑面前办公,房间阴暗,电脑桌面很乱,烟灰缸里面满是烟头...
.net ORM框架dapper批量插入
.NET ORM 框架 Dapper 批量插入全解析 在 .NET 开发中,与数据库交互是常见需求。Dapper 作为轻量级的 ORM(对象关系映射)库,在简化数据库交互方面表现出色。今天我们就来深入探讨 Dapper 实现批量插入的几种方法。 为什么需要批…...

C++11 右值引用:从入门到精通
文章目录 一、引言二、左值和右值(一)概念(二)区别和判断方法 三、左值引用和右值引用(一)左值引用(二)右值引用 四、移动语义(一)概念和必要性(二…...

.net 使用MQTT订阅消息
在nuGet下载M2Mqtt V4.3.0版本。(支持.net framework) 订阅主题 public void LoadMQQCData() {string enpoint "xxx.xxx.x.x";//ip地址int port 1883;//端口string user "usrname";//用户名string pwd "pwd";//密码…...
Python实现快速排序的三种经典写法及算法解析
今天想熟悉一下python的基础写法,那就从最经典的快速排序来开始吧: 1、经典分治写法(原地排序) 时间复杂度:平均O(nlogn),最坏O(n) 空间复杂度:O(logn)递归栈空间 特点:通过左右指针…...

【递归、搜索与回溯】综合练习(四)
📝前言说明: 本专栏主要记录本人递归,搜索与回溯算法的学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码…...

强化学习入门:Gym实现CartPole随机智能体
前言 最近想开一个关于强化学习专栏,因为DeepSeek-R1很火,但本人对于LLM连门都没入。因此,只是记录一些类似的读书笔记,内容不深,大多数只是一些概念的东西,数学公式也不会太多,还望读者多多指教…...

STM32:CAN总线精髓:特性、电路、帧格式与波形分析详解
声明:此博客是我的学习笔记,所看课程是江协科技的CAN总线课程,知识点都大同小异,我仅进行总结并加上了我自己的理解,所引案例也都是课程中的案例,希望对你的理解有所帮助! 知识点1【CAN总线的概…...

贝叶斯深度学习!华科大《Nat. Commun.》发表BNN重大突破!
华科大提出基于贝叶斯深度学习的超分辨率成像,成功被Nat. Commun.收录。可以说,这是贝叶斯神经网络BNN近期最值得关注的成果之一了。另外还有AAAI 2025上的Bella新框架,计算成本降低了99.7%,也非常值得研读。 显然鉴于BNN“不确定…...

【大模型LLM学习】Flash-Attention的学习记录
【大模型LLM学习】Flash-Attention的学习记录 0. 前言1. flash-attention原理简述2. 从softmax到online softmax2.1 safe-softmax2.2 3-pass safe softmax2.3 Online softmax2.4 Flash-attention2.5 Flash-attention tiling 0. 前言 Flash Attention可以节约模型训练和推理时间…...
三、元器件的选型
前言:我们确立了题目的功能后,就可以开始元器件的选型,元器件的选型关乎到我们后面代码编写的一个难易。 一、主控的选择 主控的选择很大程度上决定我们后续使用的代码编译器,比如ESP32使用的是VScode,或者Arduino&a…...
精益数据分析(95/126):Socialight的定价转型启示——B2B商业模式的价格策略与利润优化
精益数据分析(95/126):Socialight的定价转型启示——B2B商业模式的价格策略与利润优化 在创业过程中,从B2C转向B2B不仅是商业模式的转变,更是定价策略与成本结构的全面重构。今天,我们将通过Socialight的实…...
stm32_DMA
DMA 1. 概念与基本原理 DMA,全称Direct Memory Access,即直接存储器访问。它是微控制器(MCU)、嵌入式处理器中的一个独立硬件模块,用于在无需CPU干预的情况下,在不同内存区域(包括外设寄存器和…...

物联网数据归档之数据存储方案选择分析
在上一篇文章中《物联网数据归档方案选择分析》中凯哥分析了归档设计的两种方案,并对两种方案进行了对比。这篇文章咱们就来分析分析,归档后数据应该存储在哪里?及存储方案对比。 这里就选择常用的mysql及taos数据库来存储归档后的数据吧。 你在处理设备归档表存储方案时对…...
【自动驾驶避障开发】如何让障碍物在 RViz 中‘显形’?呈现感知数据转 Polygon 全流程
【自动驾驶避障开发】如何让障碍物在 RViz 中"显形"?呈现感知数据转 Polygon 全流程 自动驾驶系统中的障碍物可视化是开发调试过程中至关重要的一环。本文将详细介绍如何将自动驾驶感知模块检测到的障碍物数据转换为RViz可显示的Polygon(多边形)形式,实现障碍物…...

【C语言】C语言经典小游戏:贪吃蛇(上)
文章目录 一、游戏背景及其功能二、Win32 API介绍1、Win32 API2、控制台程序3、定位坐标(COORD)4、获得句柄(GetStdHandle)5、获得光标属性(GetConsoleCursorInfo)1)描述光标属性(CO…...
usbutils工具的使用帮助
作为嵌入式系统开发中的常用工具,usbutils 是一套用于管理和调试USB设备的Linux命令行工具集。以下是其核心功能和使用方法的详细说明: 1. 工具组成 核心命令: lsusb:列出所有连接的USB设备及详细信息(默认安装&#…...

vue2中使用jspdf插件实现页面自定义块pdf下载
pdf下载 实现pdf下载的环境安装jspdf插件在项目中使用 实现pdf下载的环境 项目需求案例背景,点击【pdf下载】按钮,弹出pdf下载弹窗,显示需要下载四个模块的下载进度,下载完成后,关闭弹窗即可! 项目使用的是…...

如何防止服务器被用于僵尸网络(Botnet)攻击 ?
防止服务器被用于僵尸网络(Botnet)攻击是关键的网络安全措施之一。僵尸网络是黑客利用大量被感染的计算机、服务器或物联网设备来发起攻击的网络。以下是关于如何防止服务器被用于僵尸网络攻击的技术文章: 防止服务器被用于僵尸网络ÿ…...