1. 问题背景与核心逻辑解析
这个题目描述了一个典型的机器人路径模拟问题。我们需要模拟一个机器人在二维网格地图上的移动过程,并统计它访问过的所有不同位置的数量。这类问题在实际应用中非常常见,比如机器人导航、游戏AI路径规划等场景。
1.1 地图与机器人状态表示
地图使用一个n×m的字符矩阵表示:
- '.'代表空地,机器人可以通过
- 'x'代表障碍物,机器人不能通过
机器人状态由两个部分组成:
- 位置坐标(x,y),表示当前所在的行和列
- 朝向d,用0-3的整数表示:
- 0:东(向右)
- 1:南(向下)
- 2:西(向左)
- 3:北(向上)
1.2 移动规则详解
每次操作机器人会执行以下逻辑:
-
根据当前朝向计算下一步的位置(x',y'):
- d=0:(x, y+1)
- d=1:(x+1, y)
- d=2:(x, y-1)
- d=3:(x-1, y)
-
检查新位置是否合法:
- 是否在地图范围内(1≤x'≤n, 1≤y'≤m)
- 是否是空地(mp[x'][y'] == '.')
-
根据检查结果决定行动:
- 如果合法:移动到新位置,保持朝向不变
- 如果不合法:原地右转(d = (d+1)%4),不移动
1.3 问题求解目标
我们需要统计机器人在执行k次操作后,总共访问过的不同位置的数量(包括起始位置)。这需要我们在模拟过程中记录所有被访问过的位置。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法设计与实现细节
2.1 暴力模拟法解析
作者采用了最直接的暴力模拟方法,这也是解决此类问题最可靠的方式。算法时间复杂度为O(k),对于k≤10^6的情况完全可行。
核心数据结构:
- 二维数组mp[][]存储地图
- 二维数组vis[][]记录访问标记
- 方向数组dx[], dy[]表示四个方向的位移
2.2 关键代码实现
cpp复制#include<bits/stdc++.h>
using namespace std;
int dx[4]={0,1,0,-1}; // 东、南、西、北的x位移
int dy[4]={1,0,-1,0}; // 对应的y位移
char mp[1010][1010];
