Вот схема тюрьмы с использованием символов ASCII:
+------------------------------+
| |
| X X |
| |
| D
D |
| |
| |
| X X X |
| |
+------------------------------+
Стены состоят из символов трубы |
, тире -
и столбов +
для углов и пересечений. Есть также две двери, отмеченные D
(которые всегда будут на левой и правой стенах). Тюрьма заполнена страшными людьми с пометкой X
.
Цель состоит в том, чтобы построить стены, чтобы удовлетворить следующие требования:
- Каждый человек находится в одиночном заключении;
- Между двумя дверями проходит коридор;
- Каждая клетка содержит ровно одну дверь, которая напрямую связана с главным коридором;
- Все пространство в тюрьме используется камерами и коридором;
- Каждая ячейка содержит человека (то есть, нет пустых ячеек).
Коридор представляет собой единый путь, не разветвляется и всегда имеет ширину в один символ. Вот решение для тюрьмы выше:
+---------+--------------------+
| | |
| X | X |
| | +--------+
+------D--+-----D-----+ D
D +---D--+
+----D--------+---D-----+ |
| | | |
| X | X |X |
| | | |
+-------------+---------+------+
Вы можете предположить, что любая входная тюрьма всегда будет иметь действительный выход. Вот еще несколько входных тюрем, а также возможные выходы:
+------------------------------+
|X X X X X X X X X X X X X X X |
| |
D D
| |
| X |
+------------------------------+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+--+
|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X |
+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D-+
D D
+----------------------D-------+
| X |
+------------------------------+
+-----------+
|X |
| |
| |
|X X|
| |
| X|
| |
D D
+-----------+
+-+-------+-+
|X| D |
| D +---+ | |
+-+ | | |
|X| | +---+X|
| | | | +-+
| D | | X|
+-+ | +-D---+
D | D
+---+-------+
+----------------+
|X X X X|
| |
D |
| |
|X X X |
| |
| |
| |
| X X D
| |
| |
+----------------+
+---+---+----+---+
|X | X | X | X|
+--D+--D+---D+--D+
D |
+---+---+------+ |
|X | X | X | |
+--D+--D+---D--+ |
| |
| +-----+------+-+
| | X | X | D
| +----D+---D--+ |
| |
+----------------+
Ответы:
Python 2 ,
2986288129492135207520711996 байтПопробуйте онлайн!
Это было в гольфе значительно; тем не менее, все еще может быть место для улучшения. Этот фрагмент кода, однако, решает все контрольные примеры. Не работает очень эффективно; для больших тюрем архитектор может не торопиться, чтобы выяснить это.
Использует простой алгоритм поиска пути, чтобы соединить обе двери и заключенных с коридором. Затем он заключает в капсулу всех заключенных и их стены и толкает указанные стены в пустом пространстве, пока все это не будет заполнено. В качестве последнего шага реализован внешний вид ASCII.
Мне понадобилось несколько часов, чтобы написать. Я надеюсь, что это также работает в других тюрьмах, кроме тестовых случаев. (Вы не можете проверить их все, не так ли?)
источник
P
). Это недопустимый формат ввода-вывода. Вы должны использовать либоinput()
определить функцию.C
37323642 байтаЯ определенно мог бы сыграть в гольф немного дальше, но это довольно хорошее начало. Изначально я не знал, что у моего подхода есть имя, так что выкрикивайте @TehPers за то, что он дал мне имя для исследования. Я определенно наслаждался проблемой, которую предложил этот вопрос. :)
-63 байта из предложений @ Джонатана. Я также заменить
char
сtypedef char R
и заменены все литералы символов, которые меньше , чем 100 с их значениями ASCII в общей сложности 90 байтБыстрое объяснение моего кода.
Чтобы использовать эту программу, передайте карту в виде строки с символами новой строки или с каждым уровнем, разделенным пробелом, как в следующем примере.
код
источник
free(t);free(u);
в конце вашей программы. Кроме того,'\0'
равно0
, экономя еще 3 байта.typedef int Q;
и заменить все вхожденияint
сQ
, вы можете сэкономить еще 44 байт.