题解:学而思编程 海龟作图
【题目来源】
学而思编程:海龟作图
【题目描述】
二维平面上有一只海龟,一开始,海龟面向 \(x\) 轴正方向,位于坐标原点 \((0,0)\)。接下来,海龟接受一连串命令,每个命令可以用一个大写字母表示:
R 表示海龟沿顺时针旋转 \(90\) 度;
L 表示海龟沿逆时针旋转 \(90\) 度;
F 表示海龟沿当前方向前进一个单元;
B 表示海龟沿当前方向后退一个单元。
请求出所有指令执行完时,海龟的位置坐标。
【输入】
一行一个字符串 \(s\),表示海龟的移动指令。
【输出】
一行两个整数,表示海龟最终的坐标。
【输入样例】
FFF
【输出样例】
3 0
【核心思想】
-
问题分析:海龟初始位于原点 \((0,0)\),面向东方。接受
R(右转90度)、L(左转90度)、F(前进1格)、B(后退1格)指令序列,求最终坐标。这是一个方向模拟 + 坐标更新问题,关键在于用状态变量维护当前方向,根据方向更新坐标。 -
算法选择:
- 方向编码:用 \(0,1,2,3\) 分别表示东、北、西、南四个方向
- 模运算转向:右转(顺时针)对应方向编码 \(-1\)(即 \(+3 \bmod 4\)),左转(逆时针)对应方向编码 \(+1 \bmod 4\)
- 方向向量:每个方向对应固定的坐标增量
-
关键步骤:
- 初始化:
- 读取指令字符串 \(s\)
dir = 0:初始面向东方x = 0, y = 0:初始位置在原点
- 执行指令(遍历 \(i\) 从 \(0\) 到
s.size()-1):- 若
s[i] == 'R':dir = (dir + 3) % 4:顺时针转90度(方向编码减1) - 若
s[i] == 'L':dir = (dir + 1) % 4:逆时针转90度(方向编码加1) - 若
s[i] == 'F':沿当前方向前进1格dir == 0(东):x++dir == 1(北):y++dir == 2(西):x--dir == 3(南):y--
- 若
s[i] == 'B':沿当前方向后退1格(与前进相反)dir == 0(东):x--dir == 1(北):y--dir == 2(西):x++dir == 3(南):y++
- 若
- 输出
x和y
- 初始化:
-
时间/空间复杂度:
- 时间复杂度:\(O(|s|)\),线性遍历指令序列
- 空间复杂度:\(O(1)\),仅需常数变量
-
方向状态机的核心思想:
- 方向编码循环性:四个方向构成循环结构,用模 \(4\) 运算自然处理转向的周期性,避免大量
if-else - 前进后退对称性:
B指令等价于面向反方向执行F,也可统一为x += dx[dir] * step,其中step前进为 \(+1\)、后退为 \(-1\) - 状态独立性:每条指令的处理只依赖当前方向状态,无历史依赖,适合逐指令模拟
- 坐标增量表:可用数组
dx[4] = {1, 0, -1, 0}和dy[4] = {0, 1, 0, -1}统一前进/后退的坐标更新,进一步简化代码 - 适用于"方向控制 + 路径追踪"类问题,状态机模拟是经典解法,可扩展至更多方向、角度或三维空间
- 方向编码循环性:四个方向构成循环结构,用模 \(4\) 运算自然处理转向的周期性,避免大量
【算法标签】
模拟
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s; // 输入指令字符串
cin >> s;
int dir = 0; // 方向:0东,1北,2西,3南
int x = 0, y = 0; // 当前位置
for (int i = 0; i < s.size(); i++) // 遍历每个指令
{
if (s[i] == 'R') // 右转
{
dir = (dir + 3) % 4; // 逆时针转90度
}
if (s[i] == 'L') // 左转
{
dir = (dir + 1) % 4; // 顺时针转90度
}
if (s[i] == 'F') // 前进
{
if (dir == 0) // 向东
{
x++;
}
if (dir == 1) // 向北
{
y++;
}
if (dir == 2) // 向西
{
x--;
}
if (dir == 3) // 向南
{
y--;
}
}
if (s[i] == 'B') // 后退
{
if (dir == 0) // 向西后退
{
x--;
}
if (dir == 1) // 向南后退
{
y--;
}
if (dir == 2) // 向东后退
{
x++;
}
if (dir == 3) // 向北后退
{
y++;
}
}
}
cout << x << " " << y; // 输出最终位置
return 0;
}
【运行结果】
FFF
3 0
浙公网安备 33010602011771号