점액 금형 수 계산!


10

배경

슬라임 금형 이 훌륭합니다. 음식 소스가있는 표면에 배치하면 음식을 찾기 위해 덩굴손을 퍼뜨린 다음 소스 사이를 연결하는 네트워크를 형성합니다. 이 도전에서는 음식을 찾는 점액 곰팡이를 시뮬레이션해야합니다. 또한,이 특정 금형은 일단 발견되면 멈출 것입니다.

입력

입력 L은 사용자 언어의 기본 형식으로 된 2D 정수 좌표 목록 과 음이 아닌 정수 여야합니다 N. 이 목록 L은 중복되지 않아야하지만 정렬되지 않을 수 있습니다. 입력 N값은 0에서 길이 사이 L입니다.

이 목록 L은 음식 소스에 대한 좌표 세트를 나타냅니다. 예를 들어, 목록

[(0,0),(2,-1),(3,1),(0,4),(5,5)]

시각적으로 해석 될 수

     o
o


   o
o
  o

산출

출력은 K입력과 같은 형식의 2D 정수 좌표의 중복되지 않은 또 다른 목록 입니다. 그것은 점액 금형에 의해 형성된 네트워크를 나타내며 다음 조건을 만족해야합니다.

  • 의 교차 L하고 K정확하게 크기를 가지고 N.
  • 세트 K는 (직교 또는 대각선 인접성을 통해) 정수 그리드의 서브 세트 로 연결됩니다.
  • 의 좌표 K가 제거되면 더 이상 처음 두 조건을 만족하지 않습니다.

인 경우 N = 0출력은 빈 목록이어야합니다.

위의 목록에 허용되는 출력의 예는 다음 L과 같습니다 N = 4.

[(0,0),(0,1),(0,2),(0,3),(0,4),(1,4),(2,4),(3,3),(3,2),(3,1),(3,5),(4,5),(5,5)]

이는 다음과 같이 시각화 할 수 있습니다

   xxO
Oxx
x  x
x  x
x  O
O
  o

각 위치를 O나타내는 양의 좌표 LK, 각각 xA가 좌표를 나타내고 K있지만에서 L. 다른 출력도 허용되며 "tendrils"가 가장 짧을 필요는 없습니다. 예를 들어, 이것은 또한 수용 가능한 솔루션입니다.

   xxOxx
Oxx     x
  x    x
 x    x
x  o x
O   x
  Ox 

규칙

입력과 출력은 모두 집합이거나 다른 데이터 유형이 아닌 목록이어야합니다. 좌표 자체는 목록 또는 튜플 일 수 있습니다. 필요한 경우 두 입력의 순서를 변경할 수 있습니다.

전체 프로그램이나 함수를 작성할 수 있습니다. 가장 낮은 바이트 수가 이기고 표준 허점이 허용되지 않습니다.

테스트 사례

프로그램은의 모든 해당 값에 대해이 목록에서 작업해야합니다 N.

[]
[(2,3)]
[(0,0),(1,0),(0,1),(1,1)]
[(0,0),(2,-1),(3,1),(0,4),(5,5)]
[(0,0),(1,0),(2,0),(3,0),(0,3),(1,3),(2,3),(3,3)]
[(0,0),(1,0),(2,0),(3,0),(0,3),(1,3),(2,3),(3,3),(0,1),(0,2),(3,1),(3,2),(8,1),(8,2),(-5,1),(-5,2)]
[(0,0),(20,0),(15,15),(-10,4),(-10,3),(0,-5),(7,6),(7,7),(8,8),(9,8),(10,-2),(-1,12),(-3,10)]
[(0,0),(1,0),(2,0),(3,0),(5,0),(6,0),(7,0),(0,9),(1,9),(2,9),(3,8),(4,9),(5,10),(6,10),(7,9),(3,3),(4,4),(5,5)]

시각화 :

===
o
===
oo
oo
===
     o
o     


   o  
o     
  o   
===
oooo


oooo
===
     oooo     
o    o  o    o
o    o  o    o
     oooo     
===
                         o     


         o                     

       o                       

                  oo           
                 o             
                 o             

o                              
o                              


          o                   o

                    o          


          o                    
===
     oo 
ooo o  o
   o    


     o  
    o   
   o    


oooo ooo

답변:


3

CJam, 77 95 바이트

나는 이것이 조금 더 골프를 칠 수 있다고 생각하지만 여기에 간다.

q~$<_{{:X;]{[X\]z::-~mhW*}$~:Y{_)Y1{_@=X@=}:B~-g-{+__X=!\}:C~1B=!&}g{_(Y0B-g-\C0B=!&}g}*]_&}L?p

입력은 다음과 같습니다 N <Array of coordinate array>. 예를 들면 다음과 같습니다.

4 [[0 0] [1 5] [2 1] [0 3] [5 0] [5 5]]

산출:

[[0 5] [1 5] [0 4] [0 3] [0 0] [02] [01] [11] [2 1]]

알고리즘 :

알고리즘은 매우 간단하며 다음과 같습니다.

  • 입력 좌표 배열을 정렬하십시오. 이렇게하면 좌표가 먼저 행별로 정렬 된 다음 열별로 정렬됩니다.
  • 이제 우리는 첫 번째 N포인트를 선택
  • 이제 우리는이 N점 들을 줄입니다 . 대상은 마지막 지점이고 소스는 마지막 지점의 마지막 지점입니다.
  • 그런 다음 가장 왼쪽 상단부터 시작하여 다음 지점까지 또는 바로 다음 지점까지 오른쪽 (또는 왼쪽)으로 걷습니다.
  • 그리고 나서 다음 지점으로갑니다.
  • 동일한 행에서 위의 지점까지는 발견되지 않은 지점이없는 것이 보장됩니다. 이것은 우리가 선택한 다른 지점을 건드리지 않도록합니다 N. 종점을 선택하면 두 번째 규칙이 적용됩니다.

여기에서 온라인으로 사용해보십시오

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