本题解使用字典来动态存储蚂蚁行走路径上的网格状态,以处理无限网格的问题。键为网格的x坐标,值为另一个字典,其键为y坐标,值为该位置的颜色状态('X'或'_')。蚂蚁的移动方向用列表pos定义,并用整数p管理当前方向的索引。蚂蚁移动的逻辑是,根据当前所在格子的颜色决定转向方向并翻转颜色,然后根据新方向移动到下一个格子。同时记录蚂蚁遍历过的网格的最大和最小x、y坐标,用于最后构建最小包含蚂蚁路径的矩形网格。
时间复杂度: O(K)
空间复杂度: O(K)
import collections
class Solution:
def printKMoves(self, K: int) -> List[str]:
maps = collections.defaultdict(dict) # 使用字典存储网格状态
x, y, maxX, maxY, minX, minY = 0, 0, 0, 0, 0, 0 # 初始化蚂蚁位置和边界
pos, p = ['L','U','R','D'], 2 # pos用于定位蚂蚁的朝向
move = [[0,-1],[-1,0],[0,1],[1,0]] # 移动方向的向量表示
maps[0][0] = '_' # 初始位置为白格
for _ in range(K):
if y in maps[x] and maps[x][y] == 'X':
maps[x][y] = '_' # 翻转为白格
p = (p-1) % 4 # 向左转
else:
maps[x][y] = 'X' # 翻转为黑格
p = (p+1) % 4 # 向右转
x, y = x + move[p][0], y + move[p][1] # 移动到新位置
maxX, maxY, minX, minY = max(maxX, x), max(maxY, y), min(minX, x), min(minY, y) # 更新边界
ans = [['_'] * (maxY - minY + 1) for _ in range(maxX - minX + 1)] # 创建最终的网格
for X in maps:
for Y in maps[X]:
ans[X - minX][Y - minY] = maps[X][Y] # 填充网格颜色
ans[x - minX][y - minY] = pos[p] # 标记蚂蚁的当前位置和朝向
for i in range(maxX - minX + 1):
ans[i] = ''.join(ans[i]) # 将网格行转换为字符串
return ans # 返回结果