Ловіть цих овець!


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

Примітки

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

Це , тому найкоротша відповідь у байтах виграє!


Чи може введення бути списком x координат, а за ним список y координат? наприклад{1,2,3,4},{5,6,7,8} -> {1,5},{2,6},{3,7},{4,8}
Павло

@Phoenix Nope, кожен x,yвхід повинен бути разом. Хороша думка, хоча я сам про це не думав.
CzarMatt

Які межі на координатах? Чи можливі 0 і негативи?
AGourd

3
Це напрочуд важко. Кожен раз, коли я думаю, що я маю евристику, яка розглядає всі випадки, я щось пропустив.
xnor

1
Нічого собі, який виклик. Я визнаю свою втрату; гвинт, роблячи це в 05AB1E.
Magic Octopus Urn

Відповіді:


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 () для створення списку всіх можливих розділів списку вводу. Наразі ця функція є неоптимальною, оскільки вона повертає кілька дублюваних розділів - що, однак, не змінює кінцевий результат.

Для кожної секції ми обчислюємо кількість огорож, необхідних для оточення всіх овець у кожній групі прямокутником. Сума цих парканів дає бал перегородки. Зрештою ми повертаємо найнижчий бал.

Тестові справи


Про крок 2, чому ні [ [1,1],[2,2] ] , [ [1,2] ]?
edc65

@ edc65 Сподіваємось, це тепер має бути виправлено.
Арнольд

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.