Задача
Борис очень любит различные шахматные головоломки. У него есть младший брат Вова. Борис очень любит задавать простые головоломки Вове, а в награду, если тот их решит, давать ему конфету. Но Вова, к сожалению, не очень любит шахматы, зато любит программирование.
В этот раз Борис задал Вове следующую головоломку: на шахматном поле размером $8 × 8$ клеток стоит одна шахматная фигура — конь. Необходимо расположить на поле еще две шахматные фигуры — ладью и слона, таким образом, чтобы они били коня, но не били друг друга, и конь не бил их. Так как Вова еще не очень силен в программировании, он попросил вас помочь ему с решением данной головоломки.
Напомним, что конь бьет те клетки, которые отстоят от его текущего положения на две клетки по горизонтали и одну клетку по вертикали, или на две клетки по вертикали и одну по горизонтали.
Ладья бьет те клетки, которые находятся на той же горизонтали или вертикали, что и она. Слон бьет те клетки, которые находятся на той же диагонали, что и он.
Входные данные
Первая строка входного файла содержит положение коня в следующем формате. Сначала буква от $a$ до $h$, обозначающая номер столбца в котором находится конь, потом цифра от $1$ до $8$, обозначающая номер строки.
Выходные данные
В первую строку выведите положение ладьи в аналогичном формате, во вторую строку выведите положение слона.
Гарантируется, что требуемая расстановка всегда существует.
Тесты
№ | Ввод | Вывод |
1 | a1 | d1 b2 |
2 | h8 | e8 g7 |
3 | e5 | b5 d4 |
4 | c8 | f8 d7 |
5 | h6 | e6 g5 |
Код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> using namespace std; int main() { int k1; char k0; cin >> k0 >> k1; int n = 8; //Вводим n, чтобы иметь возможность изменить размер доски char mid = char (('a' + n) - n / 2); //Находим середину доски if ( k1 != 1) { if (k0 < mid) cout << char(k0 + 3) << k1 << "\n" << char(k0 + 1) << k1 - 1; else cout << char(k0 - 3) << k1 << "\n" << char(k0 - 1) << k1-1; } else { if (k0 < mid) cout << char(k0 + 3) << k1 << "\n" << char(k0 + 1) << k1 + 1; else cout << char(k0 - 3) << k1 << "\n" << char(k0 - 1) << k1 + 1; } return 0; } |
Решение
Для решения данной задачи ладью всегда будем размешать на две клетки левее или правее коня, а слона — на одну клетку вниз/вверх по диагонали от него.
Задачу вы решили, но опубликовали не тот код. И по ссылкам не тот.
Вы были правы, спасибо.
Данное решение неплохо для данной конкретной задачи. Но что будет, если вдруг у нас окажется доска 9х9 или 19х19? Есть ли более общий подход?
Тишина…
Добавлю
— Вполне достаточно расмотреть четыре базовые ситуации. Фактически можно выбрать одно базовое размещение фигур, например в прямоугольнике 2 х 4 с конем в одной из вершин, и разместить его на доске.
— Удобнее пользоваться числовыми индексами для обозначения координат. Для буквенных нужно так построить решение, чтобы особым случаем требующим проверки было размещение коня на первой вертикали — ее кордината всегда «A».
— Лучше не сдвигать вправо если используете else if.
Большое спасибо, все исправила.
Выбрала базовое размещение, но с немного другим особым случаем. Заметила уже потом, это не играет никакой роли.
Единственное, строки оказались не совсем тут нужны. Если необходимо, я переделаю со строками, но общий случай перестанет работать.
Спасибо за замечание. Общий подход действительно есть и я его уже описала.
В результате обошлись без всяких строк. Перемещаю эту задачу в категорию поисковых, а на строки даю другую.