题解:学而思编程 海龟作图

【题目来源】

学而思编程:海龟作图

【题目描述】

二维平面上有一只海龟,一开始,海龟面向 \(x\) 轴正方向,位于坐标原点 \((0,0)\)。接下来,海龟接受一连串命令,每个命令可以用一个大写字母表示:

R 表示海龟沿顺时针旋转 \(90\) 度;

L 表示海龟沿逆时针旋转 \(90\) 度;

F 表示海龟沿当前方向前进一个单元;

B 表示海龟沿当前方向后退一个单元。

请求出所有指令执行完时,海龟的位置坐标。

【输入】

一行一个字符串 \(s\),表示海龟的移动指令。

【输出】

一行两个整数,表示海龟最终的坐标。

【输入样例】

FFF

【输出样例】

3 0

【核心思想】

  1. 问题分析:海龟初始位于原点 \((0,0)\),面向东方。接受 R(右转90度)、L(左转90度)、F(前进1格)、B(后退1格)指令序列,求最终坐标。这是一个方向模拟 + 坐标更新问题,关键在于用状态变量维护当前方向,根据方向更新坐标。

  2. 算法选择

    • 方向编码:用 \(0,1,2,3\) 分别表示东、北、西、南四个方向
    • 模运算转向:右转(顺时针)对应方向编码 \(-1\)(即 \(+3 \bmod 4\)),左转(逆时针)对应方向编码 \(+1 \bmod 4\)
    • 方向向量:每个方向对应固定的坐标增量
  3. 关键步骤

    • 初始化
      • 读取指令字符串 \(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++
    • 输出 xy
  4. 时间/空间复杂度

    • 时间复杂度:\(O(|s|)\),线性遍历指令序列
    • 空间复杂度:\(O(1)\),仅需常数变量
  5. 方向状态机的核心思想

    • 方向编码循环性:四个方向构成循环结构,用模 \(4\) 运算自然处理转向的周期性,避免大量 if-else
    • 前进后退对称性B 指令等价于面向反方向执行 F,也可统一为 x += dx[dir] * step,其中 step 前进为 \(+1\)、后退为 \(-1\)
    • 状态独立性:每条指令的处理只依赖当前方向状态,无历史依赖,适合逐指令模拟
    • 坐标增量表:可用数组 dx[4] = {1, 0, -1, 0}dy[4] = {0, 1, 0, -1} 统一前进/后退的坐标更新,进一步简化代码
    • 适用于"方向控制 + 路径追踪"类问题,状态机模拟是经典解法,可扩展至更多方向、角度或三维空间

【算法标签】

模拟

【代码详解】

#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
posted @ 2026-07-04 15:02  团爸讲算法  阅读(12)  评论(0)    收藏  举报