题目分析
1. 地图与坐标:
* 地图是 nnn 行 mmm 列。
* 坐标 (x,y)(x, y)(x,y) 表示第 xxx 行第 yyy 列。
* 字符 x 是障碍,. 是空地。
2. 机器人状态:
* 位置 (x,y)(x, y)(x,y)。
* 朝向 ***:000 (东), 111 (南), 222 (西), 333 (北)。
3. 行动规则(每一步):
* 尝试移动:根据当前朝向 *** 计算下一步位置 (x′,y′)(x', y')(x′,y′)。
* d=0d=0d=0 (东): (x,y+1)(x, y+1)(x,y+1)
* d=1d=1d=1 (南): (x+1,y)(x+1, y)(x+1,y)
* d=2d=2d=2 (西): (x,y−1)(x, y-1)(x,y−1)
* d=3d=3d=3 (北): (x−1,y)(x-1, y)(x−1,y)
* 判断合法性:
* 如果在地图范围内(1≤x′≤n,1≤y′≤m1 \le x' \le n, 1 \le y' \le m1≤x′≤n,1≤y′≤m)且是空地(.):
* 移动:位置变为 (x′,y′)(x', y')(x′,y′),朝向 *** 不变。
* 否则(出界或遇到障碍):
* 右转:位置不变,朝向变为 (d+1)(mod4)(d+1) \pmod 4(d+1)(mod4)。
4. 目标:
* 执行 kkk 次操作后,统计经过的不同位置的数量(包括起点)。
解题思路
由于 k≤106k \le 10^6k≤106,直接模拟每一步操作的时间复杂度是 O(k)O(k)O(k),完全可以在 1 秒内完成。我们需要一个数据结构来记录哪些位置已经被访问过,可以使用一个二维布尔数组 visited[n][m]。
步骤:
1. 读取 TTT 组数据。
2. 对于每组数据:
* 读取 n,m,kn, m, kn,m,k 和初始状态 x0,y0,d0x_0, y_0, d_0x0 ,y0 ,d0 。
* 读取地图字符串。
* 初始化 visited 数组,标记起点 visited[x0][y0] = true,计数器 ans = 1。
* 循环 kkk 次:
* 计算下一步坐标 nx, ny。
* 检查 nx, ny 是否合法(在界内且是 .)。
* 如果合法:更新当前位置 x, y。如果该位置未访问过,标记并 ans++。
* 如果不合法:更新朝向 d = (d + 1) % 4。
* 输出 ans。