e-olymp 1488. Шахматная головоломка

Задача

prb1488

Борис очень любит различные шахматные головоломки. У него есть младший брат Вова. Борис очень любит задавать простые головоломки Вове, а в награду, если тот их решит, давать ему конфету. Но Вова, к сожалению, не очень любит шахматы, зато любит программирование.

В этот раз Борис задал Вове следующую головоломку: на шахматном поле размером $8 × 8$ клеток стоит одна шахматная фигура — конь. Необходимо расположить на поле еще две шахматные фигуры — ладью и слона, таким образом, чтобы они били коня, но не били друг друга, и конь не бил их. Так как Вова еще не очень силен в программировании, он попросил вас помочь ему с решением данной головоломки.

Напомним, что конь бьет те клетки, которые отстоят от его текущего положения на две клетки по горизонтали и одну клетку по вертикали, или на две клетки по вертикали и одну по горизонтали.

Ладья бьет те клетки, которые находятся на той же горизонтали или вертикали, что и она. Слон бьет те клетки, которые находятся на той же диагонали, что и он.

Входные данные

Первая строка входного файла содержит положение коня в следующем формате. Сначала буква от $a$ до $h$, обозначающая номер столбца в котором находится конь, потом цифра от $1$ до $8$, обозначающая номер строки.

Выходные данные

В первую строку выведите положение ладьи в аналогичном формате, во вторую строку выведите положение слона.

Гарантируется, что требуемая расстановка всегда существует.

Тесты

Ввод Вывод
1 a1 a4
b2
2 h8 h5
g7
3 e5 d5
f6
4 c8 b8
d9
5 h6 e6
g7

Код

Решение

Самое первое, что важно заметить это то, что почти всегда существует больше одного варианта размещения ладьи и слона. Нас интересует любое. Разумеется, что чем более общая для всех случаев расстановка, тем проще будет код.

Чтобы понять логику моих размышлений стоит взглянуть на иллюстрацию. Первый квадрат показывает размещение слона относительно коня, два других — ладьи.

Чтоб не нагромождать изображение, если две расстановки симметричны, детально показана только одна из них.

Остается только аккуратно прописать все  случаи.

Также можно не хранить массивы для ладьи и слона, а выводить частями. Это сэкономит немного памяти, но код станет менее разборчивым.

Код для общего случая

Решение для общего случая

Идея абсолютно не отличается от предыдущей. В данном случае мы считываем размер доски и исходя из этого определяем положение ладьи и слона.

Так как размер может быть не однозначным числом, массив на два элемента не подойдет. Будем использовать переменные.

Ссылки

Задача 1488 на e-olymp

Код задачи на Ideone

Код для общего случая на Ideone

4 thoughts on “e-olymp 1488. Шахматная головоломка

  1. Данное решение неплохо для данной конкретной задачи. Но что будет, если вдруг у нас окажется доска 9х9 или 19х19? Есть ли более общий подход?

    • Тишина…
      Добавлю
      — Вполне достаточно расмотреть четыре базовые ситуации. Фактически можно выбрать одно базовое размещение фигур, например в прямоугольнике 2 х 4 с конем в одной из вершин, и разместить его на доске.
      — Удобнее пользоваться числовыми индексами для обозначения координат. Для буквенных нужно так построить решение, чтобы особым случаем требующим проверки было размещение коня на первой вертикали — ее кордината всегда «A».
      — Лучше не сдвигать вправо если используете else if.

Добавить комментарий