Виды гусей, известные как Алекс А , известны тем, что живут в треугольных сетках, состоящих из 64 ячеек:
(Фото взято из этой несвязанной проблемы Project Euler .)
Мы будем маркировать каждую ячейку с номерами , 0
чтобы 63
начиная с верхнего ряда , а затем двигаясь слева направо в каждой строке ниже этого. Таким образом, верхняя ячейка 0
и нижняя правая ячейка 63
.
Каждая ячейка имеет три границы. Мы можем пометить каждую границу в форме, a,b
где a
и b
являются номерами ячеек, которые разделяют эту границу. Например, граница между ячейкой 0
и 2
будет названа 0,2
или 2,0
(не имеет значения, в каком порядке вы их разместите).
Система маркировки границ на самом краю сетки различна, поскольку ячейки на краю сетки имеют границу, которую они не разделяют с другими ячейками. Если граница является только частью одной ячейки, мы будем использовать букву X
. Например, три границы ячейки 0
являются 0,2
, 0,X
и 0,X
.
Некоторые клетки содержат гусей . Тем не менее, эти гуси будут убиты злыми лисами (которые приходят из-за пределов сетки), если вы не защитите их. И если все гуси умрут, BrainSteel будет грустным. Поэтому мы напишем программу, которая строит заборы вокруг гусей, чтобы защитить их от лис. Гуси должны существовать в одном полностью огороженном многоугольнике. Наш бюджет заборов довольно низок, поэтому используйте как можно меньше заборов.
Описание входа
Список чисел, разделенных запятой, от 0
до 63
, представляющих ячейки, которые содержат гусей. Пример:
6,12
Описание выхода
Список границ, на которых должны быть построены заборы, чтобы успешно защитить гусей. Это должно быть наименьшее количество возможных заборов. Пример:
5,6 6,7 11,12 12,13
Ответы:
C #, 530 байт
Завершить программу на C #, получить ввод в виде одной строки из STDIN и вывести одну строку в STDOUT с завершающим "".
Это довольно долго ... и имеет слишком много повторений x / y / z, но я не смог до сих пор свести его к чему-то разумному, и сдать экзамен через 2 часа может вернуться к этому завтра.
Эта диаграмма объясняет большую часть того, что происходит.
Признайте, что из-за того, что у нас не может быть секций шириной 0, «шестиугольник» всегда будет самой дешевой формой (и он дает гусям максимум места для перемещения).
Программа работает, сначала переводя все индексы входных ячеек в координаты x / y / z и находя min / max каждого из x / y / z.
Затем он проходит через каждый индекс ячейки и проверяет, подходит ли он в границу «шестиугольника», которую мы описали. Если это так, то он проверяет, находится ли он на каком-либо из крайних ребер границ (т. Е. X = xmin или y = ymax), и добавляет соответствующие ребра, если это так. Он должен определить индекс края, с которым он рядом. Для x и z мы просто увеличиваем / уменьшаем их по своему усмотрению, а затем используем следующую формулу:
Обратите внимание, что «четность» всегда меняется, и что у не участвует. Для y нам не нужно ничего менять, но код немного беспорядочный, потому что он должен выполнять проверку границ "треугольника", чтобы определить, должна ли ячейка по соседству быть "X" или нет.
Пример решения (Клетки с гусями в трех углах):
Код Tidier с комментариями:
источник
using System;
.using Q=System.Console;Q.Write();Q.ReadLine()
(45 байт) против вашего предложенияusing System;Console.Write();Console.ReadLine()
(47 байт).i
,x
,y
,z
, иp
0.