Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Конкурсы и Олимпиады по Машинному программированию (КОМП) Разбор уровня 1


Сегодня разберём задачу уровня 1.

На первом уровне задачи простые. Задача уровня 1 не требовала использовать циклы.

Для успешного решения достаточно заметить несколько простых вещей. Можно заметить, что расстояние в шагах по диагонали и по горизонтали или вертикали одинаково.  Значит, расстояние до угла равно расстоянию до одной из сторон (которые составляют этот угол). А сторону нужно брать которая дальше.  Тогда путь получится если идти сначала по диагонали в сторону угла, пока не дойдём до края, а потом у угол. Но углов 4. Из них нужно выбрать тот, который ближе. А ближе тот, для которого большее из расстояний до сторон его составляющих меньше других.

Получается такой алгоритм:

  1. Определяем куда блише идти: вправо или влево.
  2. Определяем куда блише идти: верх или вниз.
  3. Из этих двух минимумов находим максимум. Это и есть нужное количество шагов.

В этой задаче есть одна техническая трудность. Координаты задаются в буквенной нотации. Значит, нужно перевести букву в число. Буквы могут быть как заглавные, так и прописные. Проще всего читать координаты как два символа, а потом преобразовать символ в число. Это и есть та самая техническая трудность. Можно, конечно, написать 24 условных оператора, но можно сделать проще.

Известно, что все символы на компьютере имеют уникальные номера - коды. Для получения кода символа во всех языках программирования есть специальные функции. В языке Pascal это ord. Так же известно, что символы '0', '1', '2', ... '9' нумеруются в алфавитном порядке. Это значит, что если из кода цифры вычесть код '0', то получится сама цифра. То же верно для латинских букв. Только надо не забыть, что 'А'  должна перевестись в 1, а не в 0. Проблема больших и маленьких букв решается переводом всех букв в один размер (регистр), такие команды во всех приличных языках программирования есть. Для Паскаля это UpCase.

В результате получаем такую несложную программу:

program Level1;
var
X, Y :char;
Hm, Wm,
H, W :integer;
begin
read(Y,X);
Y:=UpCase(Y);
H:=ord(Y)-ord('A')+1;
W:=ord(X)-ord('0');
if H-1< 8-H then Hm := H-1 else Hm := 8-H;
if W-1< 8-W then Wm := W-1 else Wm := 8-W;
if Hm>Wm then writeln(Hm) else writeln(Wm);
end.

Результаты на сегодняшний день

Уровень 5

Чернов Николай Алексеевич.

Уровень 4


Уровень 3

Бурлаков Никита Александрович, Исупов Евгений Сергеевич, Cоснов Aнтон Сергеевич.

Уровень 2

Карета Максим Станиславович, Рура Виталий Александрович, Марципака Андрей Юрьевич, Смирнов Борис Андреевич, Чалый Иван Александрович.

Уровень 1

Телегин Григорий Игоревич, Мазитов Александр Викторович, Афанасьева Елена Валентиновна, Халикова Елена Сергеевна, Кузьмин Юрий Викторович, Перевозчикова Мария Игоревна, Силин Алексей Леонидович, Чувашов Алексей Леонидович.

 




Автор: Пупышев Вячеслав Викторович   
e-mail: pvv@uni.udm.ru   
Web: http://colymp.da.ru   

В избранное