Редакция для Робот на клетчатом поле
Submitting an official solution before solving the problem yourself is a bannable offence.
Автор:
1. Идея
Нужно просто пройти по строке команд и поддерживать текущие координаты робота.
Изначально робот стоит в точке (0, 0).
Каждая команда изменяет только одну координату на 1:
UувеличиваетyDуменьшаетyRувеличиваетxLуменьшаетx
После обработки всех символов останется вывести получившиеся x и y.
2. Наблюдения
- Порядок выполнения команд важен для процесса, но для конечной точки достаточно честно обработать все команды по одной.
- Каждая команда влияет только на одну из координат:
- вертикальные команды
UиDменяютy - горизонтальные команды
LиRменяютx
- вертикальные команды
- Длина строки может быть до
10^6, поэтому нужен алгоритм, который работает за один проход по строке.
3. Алгоритм
- Считать строку
s. - Завести переменные
x = 0иy = 0. - Для каждого символа
cв строке:- если
c == 'U', тоy += 1 - если
c == 'D', тоy -= 1 - если
c == 'R', тоx += 1 - если
c == 'L', тоx -= 1
- если
- Вывести
xиy.
4. Почему это работает
Докажем, что алгоритм действительно находит конечные координаты робота.
В начале робот находится в точке (0, 0), это соответствует начальному значению переменных x = 0 и y = 0.
Дальше мы обрабатываем команды по одной:
- команда
Uпо условию переводит робота на одну клетку вверх, значит нужно увеличитьyна1; - команда
Dпереводит на одну клетку вниз, значит нужно уменьшитьyна1; - команда
Rпереводит вправо, значит нужно увеличитьxна1; - команда
Lпереводит влево, значит нужно уменьшитьxна1.
То есть после обработки каждой команды переменные x и y точно совпадают с реальными координатами робота после выполнения всех уже рассмотренных команд.
Значит, после обработки всей строки x и y будут равны конечным координатам робота. Следовательно, алгоритм корректен.
5. Сложность
Пусть длина строки равна n.
- Время работы:
O(n), потому что каждый символ обрабатывается ровно один раз. - Память:
O(1), если не считать память под саму входную строку.
6. Код на C++17
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
long long x = 0, y = 0;
for (char c : s) {
if (c == 'U') {
y++;
} else if (c == 'D') {
y--;
} else if (c == 'R') {
x++;
} else if (c == 'L') {
x--;
}
}
cout << x << " " << y << "\n";
return 0;
}
7. Код на Python 3
s = input().strip()
x = 0
y = 0
for c in s:
if c == 'U':
y += 1
elif c == 'D':
y -= 1
elif c == 'R':
x += 1
elif c == 'L':
x -= 1
print(x, y)
Комментарии