Редакция для Робот на клетчатом поле


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Автор: montes332

1. Идея

Нужно просто пройти по строке команд и поддерживать текущие координаты робота.

Изначально робот стоит в точке (0, 0).
Каждая команда изменяет только одну координату на 1:

  • U увеличивает y
  • D уменьшает y
  • R увеличивает x
  • L уменьшает x

После обработки всех символов останется вывести получившиеся x и y.

2. Наблюдения

  1. Порядок выполнения команд важен для процесса, но для конечной точки достаточно честно обработать все команды по одной.
  2. Каждая команда влияет только на одну из координат:
    • вертикальные команды U и D меняют y
    • горизонтальные команды L и R меняют x
  3. Длина строки может быть до 10^6, поэтому нужен алгоритм, который работает за один проход по строке.

3. Алгоритм

  1. Считать строку s.
  2. Завести переменные x = 0 и y = 0.
  3. Для каждого символа c в строке:
    • если c == 'U', то y += 1
    • если c == 'D', то y -= 1
    • если c == 'R', то x += 1
    • если c == 'L', то x -= 1
  4. Вывести 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)

Комментарии

Еще нет ни одного комментария.