Конкурсы и Олимпиады по Машинному программированию (КОМП) Разбор уровня 1
Сегодня разберём задачу уровня 1.
На первом уровне задачи простые. Задача уровня 1 не требовала использовать циклы.
Для успешного решения достаточно заметить несколько простых вещей. Можно заметить, что расстояние в шагах по диагонали и по горизонтали или вертикали одинаково. Значит, расстояние до угла равно расстоянию до одной из сторон (которые составляют этот угол). А сторону нужно брать которая дальше. Тогда путь получится если идти сначала по диагонали в сторону угла, пока не
дойдём до края, а потом у угол. Но углов 4. Из них нужно выбрать тот, который ближе. А ближе тот, для которого большее из расстояний до сторон его составляющих меньше других.
Получается такой алгоритм:
Определяем куда блише идти: вправо или влево.
Определяем куда блише идти: верх или вниз.
Из этих двух минимумов находим максимум. Это и есть нужное количество шагов.
В этой задаче есть одна техническая трудность. Координаты задаются в буквенной нотации. Значит, нужно
перевести букву в число. Буквы могут быть как заглавные, так и прописные. Проще всего читать координаты как два символа, а потом преобразовать символ в число. Это и есть та самая техническая трудность. Можно, конечно, написать 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.
Телегин Григорий Игоревич,Мазитов Александр Викторович,Афанасьева Елена Валентиновна,Халикова Елена Сергеевна,Кузьмин Юрий Викторович,Перевозчикова Мария Игоревна,Силин Алексей Леонидович,Чувашов Алексей Леонидович.