当前位置: 首页 > web >正文

[蓝桥杯]兰顿蚂蚁

兰顿蚂蚁

题目描述

兰顿蚂蚁,是于 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, 模拟, 省赛

算法思路

兰顿蚂蚁是一种基于细胞自动机的模型,其行为规则简单但能产生复杂的行为模式。核心思路是模拟蚂蚁在网格上的移动过程:

  1. ​状态判断​​:根据当前所在格子的颜色(黑/白)决定转向规则
  2. ​转向规则​​:
    • 黑格 → 右转90°
    • 白格 → 左转90°
  3. ​颜色翻转​​:翻转当前格子颜色(黑→白,白→黑)
  4. ​位置移动​​:根据新方向前进一格

通过循环执行上述操作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;
}

代码解析

  1. ​网格初始化​​(第11-17行)

    • 使用vector动态创建m×n网格
    • 0表示白格,1表示黑格
  2. ​方向映射​​(第23-28行)

    • 将字符方向(U/R/D/L)转换为数字(0/1/2/3)
    • 便于数学计算转向角度
  3. ​核心移动逻辑​​(第31-45行)

    • (dir + 3) % 4:实现左转90°(逆时针)
    • (dir + 1) % 4:实现右转90°(顺时针)
    • 1 - grid[x][y]:快速翻转格子颜色
  4. ​边界处理​

    • 题目保证移动不越界,无需额外检查

实例验证

​输入​​:

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 ✅ 符合预期


注意事项

  1. ​方向映射一致性​​:

    • 必须确保方向数字与移动操作的对应关系正确
    • 错误映射会导致移动方向混乱

      3

  2. ​颜色翻转时机​​:

    • 必须在移动​​前​​翻转当前格子颜色
    • 顺序错误会导致状态不一致

      6

  3. ​边界风险​​:

    • 虽然题目保证不越界,但可添加防护:
    // 在switch后添加边界检查
    x = max(0, min(x, m-1));
    y = max(0, min(y, n-1));
  4. ​大K值优化​​:

    • 当K>10⁶时,可考虑周期性检测
    • 记录状态(x,y,dir,gridHash)减少重复计算

      8


测试用例设计

​测试类型​​输入样例​​预期输出​​验证点​
最小网格3 3\n0 0 0\n0 0 0\n0 0 0\n1 1 U 10 1基本功能
边界移动3 3\n1 1 1\n1 1 1\n1 1 1\n0 0 D 32 0边界处理
颜色翻转1 1\n1\n0 0 U 20 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 40 1复杂转向逻辑

优化建议

  1. ​内存优化​​:

    // 使用bitset压缩存储
    #include <bitset>
    vector<vector<bitset<1>>> grid(m, vector<bitset<1>>(n));
    • 减少75%内存占用(适用于大网格)
  2. ​循环展开​​:

    // 每4步作为一组处理
    while (k >= 4) {// 处理4步移动k -= 4;
    }
  3. ​SIMD并行​​:

    • 使用AVX指令并行处理多个格子颜色翻转
    • 适用于需要同时模拟多只蚂蚁的场景
  4. ​状态缓存​​:

    unordered_map<string, int> stateMap;
    string state = to_string(x)+","+to_string(y)+","+to_string(dir)+",";
http://www.xdnf.cn/news/12580.html

相关文章:

  • 2025年全国青少年信息素养大赛 scratch图形化编程挑战赛 小高组初赛 真题详细解析
  • vue3学习(toRefs和toRef,computed计算属性 ,v-model指令,箭头函数)
  • 2025/6/4知识点总结—HALCON像素坐标转物理坐标
  • chatlog:一个基于MCP实现聊天记录总结和查询的开源工具
  • WebFuture:Syncthing配置以www-data用户运行
  • LINUX 66 FTP 2 ;FTP被动模式;FTP客户服务系统
  • Python训练营---Day46
  • R²ec: 构建具有推理能力的大型推荐模型,显著提示推荐系统性能!!
  • python中的逻辑运算
  • 什么是强化学习:设置奖励函数最为loss, 监督学习:标签准确率作为loss
  • 三维GIS开发cesium智慧地铁教程(4)城市白模加载与样式控制
  • 【正念365】助你好“眠”
  • python实战:如何对word文档的格式进行定制化排版
  • C++ const 修饰符深入浅出详解
  • leetcode1609. 奇偶树-meidum
  • untiy 模拟人物在街道走路和跑步
  • Shell编程核心符号与格式化操作详解
  • [electron]预脚本不显示内联script
  • 使用docker安装vLLM、并安装modelscope本地模型
  • 三格电子——EtherCAT分支器的应用场景
  • 2025年硬盘坏道修复工具指南:让您的硬盘焕发新生
  • 【Zephyr 系列 11】使用 NVS 实现 BLE 参数持久化:掉电不丢配置,开机自动加载
  • 【k8s】k8s集群搭建
  • 洞悉 MySQL 查询性能:EXPLAIN 命令 type 字段详解
  • 基于本地LLM与MCP架构构建AI智能体全指南
  • Nest框架: 日志功能之收集,筛选,存储,维护
  • c语言 头文件封装跨平台线程
  • SATA3.0接口PCB布局走线注意事项
  • 【Redis】Cluster集群
  • C++11 右值引用:从入门到精通