(说明:此代码只作为参考,并非绝对的正确代码,但是保证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
。 - 如果没有找到经度信息,则输出错误信息。