그 양을 잡아라!


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}
Pavel

@Phoenix Nope, 각 x,y입력은 함께 있어야합니다. 좋은 생각이지만, 나는 그것을 스스로 생각하지 못했습니다.
CzarMatt

좌표의 경계는 무엇입니까? 0과 음수가 가능합니까?
Aourd

3
놀랍게도 어렵다. 모든 경우를 처리하는 휴리스틱이 있다고 생각할 때마다 내가 놓친 것이 있습니다.
xnor

1
와우, 얼마나 도전적인가. 나는 나의 상실을 인정합니다. 05AB1E에서이 작업을 수행하십시오.
Magic Octopus Urn

답변:


5

자바 스크립트 (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 잘만되면 이제 고쳐질 것입니다.
Arnauld

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.