Bootstrap

XDF OJ P Answer-C P1005

(说明:此代码只作为参考,并非绝对的正确代码,但是保证AC)

题目:移动机器人

描述:

N×M的网格中,有一个机器人,它的初始位置为x, y。
左上角为(1,1),右下角为(N,M)。机器人可以接收上/下/左/右移动某个x个单位的指令。如:L5表示向左移动5个单位,R3表示向右移动3个单位,U2表示向上移动2个单位,D4表示向下移动4个单位。移动单位的取值范围在1−9之内。
注意,一旦移动到网格的边界,就无法继续沿着这个方向移动。现给定一串指令序列,输出机器人的坐标。

输入描述:

第一行,4个数字,分别表示N,M,x,y
第二行,一个由字母L,R,U,D和数字1−9组成的字符串。

输出描述:

两个数字,空格隔开,表示机器人的坐标。

参考代码:

#include <iostream>
#include <string>

using namespace std;

int main() {
    int N, M, x, y;
    cin >> N >> M >> x >> y;
    
    string commands;
    cin >> commands;

    for (size_t i = 0; i < commands.length(); i++) {
        char dir = commands[i];
        int steps = commands[i + 1] - '0'; 
        i++;
        switch (dir) {
            case 'L':
                
                if (y - steps >= 1) {
                    y -= steps;
                } else {
                    y = 1;
                }
                break;
            case 'R':
                if (y + steps <= M) {
                    y += steps;
                } else {
                    y = M;
                }
                break;
            case 'U':
                if (x - steps >= 1) {
                    x -= steps;
                } else {
                    x = 1;
                }
                break;
            case 'D':
                if (x + steps <= N) {
                    x += steps;
                } else {
                    x = N;
                }
                break;
        }
    }

    cout << x << ' ' << y << endl;

    return 0;
}

代码解释:

1.引入必要的头文件

#include <iostream>
#include <string>
  • iostream 用于输入输出。
  • string 用于处理字符串。

2. 主函数

int main() {
    std::string input;
    std::getline(std::cin, input);
  • 读取一行输入并存储在 input 字符串中。

3. 初始化变量

    int x = 0, y = 0;
    char latitude = ' ';
    char longitude = ' ';
  • x 和 y 用于存储坐标的值。
  • latitude 和 longitude 用于存储纬度和经度的方向标识('1' 或 '2')。

4. 提取纬度信息

    size_t lat_start = input.find_first_of('#');
    if (lat_start != std::string::npos) {
        size_t lat_end = input.find_first_of('#', lat_start + 1);
        if (lat_end != std::string::npos && lat_end > lat_start + 1) {
            latitude = input[lat_start - 1];
            for (size_t i = lat_start + 1; i < lat_end; ++i) {
                x += static_cast<int>(input[i]);
            }
        }
    }
  • lat_start 找到第一个 # 的位置。
  • lat_end 找到第二个 # 的位置。
  • 如果找到了两个 #,则提取 # 之间的字符,并计算它们的 ASCII 码之和,存储在 x 中。
  • latitude 存储纬度方向标识(1 或 2)。

5. 提取经度信息

    size_t lon_start = input.find_first_of('@');
    if (lon_start != std::string::npos) {
        size_t lon_end = input.find_first_of('@', lon_start + 1);
        if (lon_end != std::string::npos && lon_end > lon_start + 1) {
            longitude = input[lon_start - 1];
            for (size_t i = lon_start + 1; i < lon_end; ++i) {
                y += static_cast<int>(input[i]);
            }
        }
    }
  • lon_start 找到第一个 @ 的位置。
  • lon_end 找到第二个 @ 的位置。
  • 如果找到了两个 @,则提取 @ 之间的字符,并计算它们的 ASCII 码之和,存储在 y 中。
  • longitude 存储经度方向标识(1 或 2)。

6. 输出纬度

    if (latitude != ' ') {
        if (latitude == '1')
            std::cout << x << "N and ";
        else if (latitude == '2')
            std::cout << x << "S and ";
        else
            std::cout << "Invalid Latitude" << std::endl;
    } else {
        std::cout << "Latitude not found!" << std::endl;
    }
  • 如果找到了纬度信息,则根据 latitude 的值输出 N 或 S
  • 如果没有找到纬度信息,则输出错误信息。

7. 输出经度

    if (longitude != ' ') {
        if (longitude == '1')
            std::cout << y << "E" << std::endl; // 东经
        else if (longitude == '2')
            std::cout << y << "W" << std::endl; // 西经
        else
            std::cout << "Invalid Longitude" << std::endl;
    } else {
        std::cout << "Longitude not found!" << std::endl;
    }
    
    return 0;
}
  • 如果找到了经度信息,则根据 longitude 的值输出 E 或 W
  • 如果没有找到经度信息,则输出错误信息。
;