Поймай этих овец!

16

Вы фермер, и ваше стадо овец сбежало! о нет!

Вокруг этих овец, строя заборы, чтобы содержать их. Как фермер с ограниченным бюджетом, вы хотите использовать как можно меньше забора. К счастью для вас, они не самые умные овцы в мире и не бегают после побега.

задача

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

правила

  • Овцы содержатся, если они не могут бродить (нет дыр в заборе).
  • Вам не нужно содержать всех овец в одном блоке забора - может быть несколько огороженных участков, независимых друг от друга.
  • Сегменты ограждения ориентированы в кардинальных направлениях.
  • Каждый координатный кортеж представляет одну овцу.
  • Входные данные должны быть положительными целочисленными парами x>0& y>0, но могут быть отформатированы в соответствии с вашим языком.
    • то есть: {{1,1},{2,1},{3,7}, .. }или[1,2],[2,1],[3,7], ..
  • Пустые пространства внутри огороженной зоны в порядке.
  • Вы не можете предполагать, что координаты вводятся в каком-либо определенном порядке.

Например, одна овца требует, чтобы 4сегменты забора были полностью изолированы.

Контрольные примеры

[1,1]
4

[1,1],[1,2],[2,2]
8

[2,1],[3,1],[2,3],[1,1],[1,3],[3,2],[1,2],[3,3]
12

[1,1],[1,2],[2,2],[3,7],[4,9],[4,10],[4,11],[5,10]
22

[1,1],[2,2],[3,3],[4,4],[5,5],[6,6],[7,7],[8,8],[9,9]
36

[1,1],[2,2],[3,3],[4,4],[6,6],[7,7],[8,8],[9,9]
32

[2,1],[8,3],[8,4]
10

Примечания

  • Вы можете предположить, что входные координаты действительны.
  • Ваш алгоритм теоретически должен работать для любой достаточно большой целочисленной координаты (до максимального поддерживаемого значения вашего языка).
  • Либо полная программа или функциональные ответы в порядке.

Это , поэтому выигрывает самый короткий ответ в байтах!

CzarMatt
источник
Может ли input быть списком координат x, за которым следует список координат y? напр.{1,2,3,4},{5,6,7,8} -> {1,5},{2,6},{3,7},{4,8}
Павел
@ Phoenix Нет, каждый x,yвход должен быть вместе. Хорошая мысль, хотя, я не думал об этом сам.
CzarMatt
Каковы границы по координатам? Возможны ли 0 и минусы?
AGourd
3
Это на удивление сложно. Каждый раз, когда я думаю, что у меня есть эвристика, которая обрабатывает все случаи, я что-то пропустил.
xnor
1
Вау, что за проблема. Я признаю свою потерю; Винт делает это в 05AB1E.
Волшебная урна осьминога

Ответы:

5

JavaScript (ES6), 251 244 275 байт

a=>Math.min(...(P=(a,r=[[a]],c=a[0])=>(a[1]&&P(a.slice(1)).map(l=>(r.push([[c],...l]),l.map((_,i)=>r.push([[c,...l[i]],...((b=[...l]).splice(i,1),b)])))),r))(a).map(L=>L.reduce((p,l)=>l.map(([h,v])=>(x=h<x?h:x,X=h<X?X:h,y=v<y?v:y,Y=v<Y?Y:v),x=y=1/0,X=Y=0)&&p+X-x+Y-y+2,0)))*2

Как?

Мы используем рекурсивную функцию P () для создания списка всех возможных разделов входного списка. Эта функция в настоящее время является неоптимальной в том смысле, что она возвращает несколько дублированных разделов, что, однако, не меняет конечный результат.

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

Контрольные примеры

Arnauld
источник
О шаге 2, почему бы и нет [ [1,1],[2,2] ] , [ [1,2] ]?
edc65
@ edc65 Надеюсь, теперь это нужно исправить.
Арно