【QED】夏日幻魂

题目

题目链接🔗

题目描述

友也和绚音是好友。

一天夜里,绚音找到友也,希望友也能够前往一个地方帮助绚音寻找某个东西,友也爽快地答应了。

为此,绚音在友也的起始位置建立了一个二维坐标系,称为绝对坐标系,并定义友也的正面方向为 x x x 轴正方向。

现对四个方向分别标号, x x x y y y 的正方向分别为 0 0 0 1 1 1,负方向分别为 2 2 2 3 3 3,称它们为绝对方向。友也只沿着与坐标轴平行的方向行走。

请你根据绚音给出的对于友也在相对方向上移动的描述,确定目的地的绝对坐标,以及到达目的地时友也面向的绝对方向标号。

对在相对方向上的移动的描述及意义如下:

  1. F x 向前走 x x x 米。

  2. B x 先向后转,再走 x x x 米。

  3. L x 先向左转,再走 x x x 米。

  4. R x 先向右转,再走 x x x 米。

在这里插入图片描述

输入输出格式

【输入格式】

第一行输入一个正整数 T T T ,表示有 T T T 组测试数据。

每组测试数据第一行输入一个正整数 n n n,表示这组测试数据需要移动 n n n 次,接下来 n n n 行每行输入一次相对移动,格式如上所述。

【输出格式】

对于每组数据输出一行,每行输出三个整数 x x x y y y p p p,中间用空格隔开, x x x y y y 是目的地的绝对坐标, p p p 是到达目的地时友也面向的绝对方向编号 ( 0 ≤ p ≤ 3 ) (0 \le p \le 3) 0p3,共输出 T T T 组。

数据范围

1 ⩽ T ⩽ 500 1\leqslant T \leqslant 500 1T500

1 ⩽ n ⩽ 5000 1\leqslant n \leqslant 5000 1n5000

0 ⩽ x ⩽ 5 × 1 0 5 0\leqslant x \leqslant 5×10^5 0x5×105

测试样例

input1:

1
2
F 11
L 10

output1 :

11 10 1

样例说明

测试样例共 1 1 1 组测试数据。

这组测试数据共有 2 2 2 次移动,第一次移动友也向前移动 11 11 11 米,到达坐标 ( 11 , 0 ) (11,0) 110,第二次移动中,友也先向左转,再移动 10 10 10 米到达目的地,此时,友也的坐标为 ( 11 , 10 ) (11,10) 1110,面向 y y y 轴正方向。

思路

  1. 使用一个变量 now 来记录当前的朝向。朝向的表示可以通过一个数组来表示四个方向的变化,例如:
    0 表示向右(东)
    1 表示向上(北)
    2 表示向左(西)
    3 表示向下(南)
  2. 对于每一个指令:
    根据转向指令更新朝向:
    ‘L’ 表示向左转,朝向加1;
    ‘B’ 表示掉头,朝向加2;
    ‘R’ 表示向右转,朝向加3;
    根据当前朝向计算坐标的变化,更新 x 和 y。
  3. 最终输出经过所有指令后的坐标 (x, y) 以及最终的朝向 now。

代码

#include <bits/stdc++.h>
using namespace std;

int fx[] = {1, 0, -1, 0};  // 记录东、北、西、南四个方向的x坐标变化
int fy[] = {0, 1, 0, -1};  // 记录东、北、西、南四个方向的y坐标变化

void solve() {
    long long n, x = 0, y = 0;  // 初始化坐标
    int now = 0;  // 初始朝向为东
    char op;
    long long L;
    
    cin >> n;  // 输入指令的数量
    for (int i = 1; i <= n; i++) {
        cin >> op >> L;  // 输入每条指令和移动的距离
        if (op == 'L') now = (now + 1) % 4;  // 向左转
        else if (op == 'B') now = (now + 2) % 4;  // 掉头
        else if (op == 'R') now = (now + 3) % 4;  // 向右转
        
        // 根据当前朝向更新坐标
        x += L * fx[now];
        y += L * fy[now];
    }
    
    cout << x << ' ' << y << ' ' << now << '\n';  // 输出最终坐标和朝向
}

int main() {
    int T;
    cin >> T;  // 输入测试组数
    while (T--) {
        solve();  // 对每组数据调用solve函数
    }
    return 0;
}

复杂度分析

时间复杂度

遍历所有的指令的时间复杂度为 O ( n ) O(n) O(n),其中 n n n 为指令的个数。由于对于每组测试数据的处理是独立的,整体复杂度为 O ( n ) O(n) O(n)(其中 n 为每组指令的数量)

空间复杂度

O ( 1 ) O(1) O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想要AC的dly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值