Слизькі форми можуть розраховувати!


10

Фон

Слизькі форми є приголомшливими. Якщо розмістити їх на поверхні з джерелами їжі, вони поширять вусики, щоб знайти їжу, після чого вони утворюють мережу зв’язків між джерелами. У цьому завданні ви повинні імітувати слизову форму для пошуку їжі. Більше того, саме ця форма зупиниться, коли її знайдеться достатньо.

Вхідні дані

Вхідними Lданими буде список двозначних цілих координат у рідному форматі вашої мови та невід’ємне ціле число N. Список Lгарантовано не містить дублікатів, але він не може бути відсортований. Вхід Nміж 0 і довжиною Lвключно.

Список Lпредставляє набір координат джерел харчування. Наприклад, список

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

можна інтерпретувати візуально як

     o
o


   o
o
  o

Вихідні дані

Ваш вихід - це ще один без дублікату список Kдвовимірних цілих координат у тому ж форматі, що і вхідний. Він представляє мережу, утворену шлаковою формою, і вона повинна відповідати наступним умовам:

  • Перетин 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представляє координату в обох Lі K, і кожен xпредставляє координату в, Kале не в L. Інші результати також прийнятні, і "вусики" не повинні бути найкоротшими. Наприклад, це також прийнятне рішення:

   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] [0 2] [0 1] [1 1] [2 1]]

Алгоритм :

Алгоритм досить прямий вперед і виглядає так:

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

Спробуйте його онлайн тут

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