1. 题目

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

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

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

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

示例 1:
输入: 0
输出: ["R"]示例 2:
输入: 2
输出:
["_X","LX"
]示例 3:
输入: 5
输出:
["_U","X_","XX"
]说明:
K <= 100000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/langtons-ant-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

兰顿蚂蚁解释
据说最后会变成这样的图形,有意思!!!

2.1 超时解

K = 100000, 超时,string.insert 操作造成数据搬移,性能不高

class Solution {vector<string> ans = {"_"};// 右  下  左  上vector<char> dirCh = {'R','D','L','U'};
public:vector<string> printKMoves(int K) {int x = 0, y = 0, d = 0, columns = 1;while(K--)update(x,y,d,columns);//更新k步的地图ans[x][y] = dirCh[d];//最后的位置填方向return ans;}void update(int& x, int& y, int& d, int& columns) {char ch = ans[x][y];ans[x][y] = (ch=='_' ? 'X' : '_');//反转颜色d = (ch=='_' ? (d+1)%4 : (d+3)%4);//转向if(d==0)//R{y++;if(y == ans[x].size())//需要开新的地图,右侧加列{for(string& s : ans)s += '_';columns++;}}else if(d==1)//D{x++;if(x == ans.size())//需要开新的地图,下面加行ans.push_back(string(columns,'_'));}else if(d==2)//L{y--;if(y<0)//需要开新的地图,左侧加列{y = 0;for(string& s : ans)s = '_'+ s;columns++;}}else//U{x--;if(x<0)//需要开新的地图,上面加行{x = 0;ans.insert(ans.begin(),string(columns,'_'));}}}
};

2.2 deque解题

  • 采用双端队列,减少数据搬移操作
class Solution {deque<deque<char>> ans = {{'_'}};// 右  下  左  上vector<char> dirCh = {'R','D','L','U'};
public:vector<string> printKMoves(int K) {int x = 0, y = 0, d = 0, columns = 1, i = 0;while(K--)update(x,y,d,columns);//更新k步的地图ans[x][y] = dirCh[d];//最后的位置填方向vector<string> res(ans.size());string str;for(auto& dq : ans){str = "";for(char ch : dq)str += ch;res[i++] = str;}return res;}void update(int& x, int& y, int& d, int& columns) {char ch = ans[x][y];ans[x][y] = (ch=='_' ? 'X' : '_');//反转颜色d = (ch=='_' ? (d+1)%4 : (d+3)%4);//转向if(d==0)//R{y++;if(y == ans[x].size())//需要开新的地图,右侧加列{for(auto& s : ans)s.push_back('_');columns++;}}else if(d==1)//D{x++;if(x == ans.size())//需要开新的地图,下面加行ans.push_back(deque<char>(columns,'_'));}else if(d==2)//L{y--;if(y<0)//需要开新的地图,左侧加列{y = 0;for(auto& s : ans)s.push_front('_');columns++;}}else//U{x--;if(x<0)//需要开新的地图,上面加行{x = 0;ans.push_front(deque<char>(columns,'_'));}}}
};

516 ms 49.8 MB

程序员面试金典 - 面试题 16.22. 兰顿蚂蚁(deque模拟)相关推荐

  1. java兰顿蚂蚁解题思路_程序员面试金典 - 面试题 16.22. 兰顿蚂蚁(deque模拟)

    1. 题目 一只蚂蚁坐在由白色和黑色方格构成的无限网格上. 开始时,网格全白,蚂蚁面向右侧. 每行走一步,蚂蚁执行以下操作. (1) 如果在白色方格上,则翻转方格的颜色,向右(顺时针)转 90 度,并 ...

  2. [Leetcode][程序员面试金典][面试题16.11][JAVA][跳水板][数学][动态规划]

    [问题描述][简单] [解答思路] 边界问题 k=0 ,不能产生跳水板,返回空数组 shorter 等于longer,只有一种跳水板,返回longerk 思路 一般情况,k块木板,k种可能 跳水板的长 ...

  3. 程序员面试金典 - 面试题 17.22. 单词转换(BFS)

    1. 题目 给定字典中的两个词,长度相等. 写一个方法,把一个词转换成另一个词, 但是一次只能改变一个字符. 每一步得到的新词都必须能在字典中找到. 编写一个程序,返回一个可能的转换序列.如有多个可能 ...

  4. 程序员面试金典 - 面试题 16.09. 运算(只用+法做乘除)

    1. 题目 请实现整数数字的乘法.减法和除法运算,运算结果均为整数数字, 程序中只允许使用加法运算符和逻辑运算符,允许程序中出现正负常数,不允许使用位运算. 你的实现应该支持如下操作: Operati ...

  5. 程序员面试金典 - 面试题 16.16. 部分排序(排序/不排序)

    文章目录 1. 题目 2. 解题 2.1 排序 2.2 不排序 1. 题目 给定一个整数数组,编写一个函数,找出索引 m 和 n ,只要将索引区间 [m,n] 的元素排好序,整个数组就是有序的. 注意 ...

  6. 程序员面试金典 - 面试题 16.18. 模式匹配(逻辑题)

    1. 题目 你有两个字符串,即pattern和value. pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式. 例如,字符串"ca ...

  7. 程序员面试金典 - 面试题 16.14. 最佳直线(哈希map+set)

    1. 题目 给定一个二维平面及平面上的 N 个点列表Points,其中第i个点的坐标为Points[i]=[Xi,Yi]. 请找出一条直线,其通过的点的数目最多. 设穿过最多点的直线所穿过的全部点编号 ...

  8. 程序员面试金典 - 面试题 16.13. 平分正方形(数学)

    1. 题目 给定两个正方形及一个二维平面.请找出将这两个正方形分割成两半的一条直线. 假设正方形顶边和底边与 x 轴平行. 每个正方形的数据square包含3个数值,正方形的左下顶点坐标[X,Y] = ...

  9. 程序员面试金典 - 面试题 16.03. 交点(数学)

    1. 题目 给定两条线段(表示为起点start = {X1, Y1}和终点end = {X2, Y2}),如果它们有交点,请计算其交点,没有交点则返回空值. 要求浮点型误差不超过10^-6.若有多个交 ...

最新文章

  1. 利用数据寿命增加基于闪存的存储类存储器的使用寿命
  2. WINDOWS 2008 脱机文件夹
  3. HDU1217(Bellman-ford和Floyd两种算法)
  4. Error in apply(df$var1, 2, mean) : dim(X) must have a positive length
  5. 最近想问题想的睡不着,上来郁闷下!
  6. PROC系列之---/proc/pid/stat
  7. C. Vanya and Scales
  8. ae saber插件_【AE插件】 用于做动画制作/设计的五个免费插件 非常好用
  9. 阿里云CentOS-7.2安装mysql
  10. 六安瓜片在51CTO【礼树迎蛇 红满社区】
  11. React16:Hooks总览,拥抱函数式 (这大概是最全的React Hooks吧)
  12. html 选择自动增加行数,HTML怎么自动计算出上两行的值在第三行里面?
  13. 【转】优化WebLogic 服务器性能参数
  14. 【编辑器】常用编程环境使用感受20190804
  15. word转pdf免费网站
  16. Windows 使用学习
  17. linux中的cd命令是什么意思,linux中cd命令的详细解释
  18. 简单图片木马的生成与利用
  19. dz邮箱验证怎么设置_详细步骤!Discuz如何设置通过 SOCKET 连接 SMTP 服务器发送(支持 ESMTP 验证)实现论坛邮箱验证功能...
  20. mysql实验五索引和数据完整性_实验六 索引和数据完整性约束

热门文章

  1. 热血街头Java,下载_我爱法语 V3.01 多国语言版_6z6z下载站
  2. C++/C 宏定义(define)中# ## 的含义(转)
  3. python 比赛成绩预测_利用 Python 预测英雄联盟胜负,分析了 5 万多场比赛才得出的数据!值得,涨知识了!...
  4. objectid.go源码阅读
  5. 【代码笔记】iOS-清除图片缓存UIActionSheet
  6. 将字符串编码成 GBK
  7. Flex读取XML不刷新问题
  8. c++整理--虚函数
  9. 排序 八种经典排序算法
  10. 通信PK电子,谁牛?