Balçık Kalıpları Sayılabilir!


10

Arka fon

Balçık kalıpları harika. Onları yiyecek kaynakları olan bir yüzeye yerleştirirseniz, yiyecekleri bulmak için dalları yayılır, daha sonra kaynaklar arasında bir bağlantı ağı oluştururlar. Bu meydan okumada, yiyecek arayan bir balçık kalıp simüle etmelisiniz. Ayrıca, bu kalıp yeterli bulunduğunda durur.

Giriş

Girdileriniz, Ldilinizin yerel biçimindeki 2B tamsayı koordinatlarının bir listesi ve negatif olmayan bir tam sayı olmalıdır N. Listenin kopyasız Lolacağı garanti edilir, ancak sıralanmayabilir. Girdi N0 ile kapsanan uzunluk arasındadır L.

Liste L, gıda kaynakları için bir dizi koordinatı temsil eder. Örneğin, liste

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

görsel olarak yorumlanabilir

     o
o


   o
o
  o

Çıktı

Çıktınız, Kgirişle aynı formatta 2D tamsayı koordinatlarının kopyasız başka bir listesidir . Balçık kalıbının oluşturduğu ağı temsil eder ve aşağıdaki koşulları karşılamalıdır:

  • Kesişimi Lve Kboyutu tam olarak N.
  • Küme K, tamsayı ızgarasının bir alt kümesi olarak bağlanır (dikey veya çapraz bitişiklerle).
  • Herhangi bir koordinatı Kkaldırılırsa, artık ilk iki koşulu karşılamaz.

N = 0Çıktının boş bir liste olması gerektiğini unutmayın .

Yukarıdaki liste için kabul edilebilir bir çıkış örneği Lve N = 4olur

[(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)]

olarak görselleştirilebilir

   xxO
Oxx
x  x
x  x
x  O
O
  o

Her yerde Otemsil eder hem de koordine Lve Kve her xbir koordinat temsil Kdeğil de L. Diğer çıktılar da kabul edilebilir ve "dalları" mümkün olan en kısa sürede yapmak zorunda değilsiniz. Örneğin, bu da kabul edilebilir bir çözümdür:

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

kurallar

Hem girdi hem de çıktı kümeler veya diğer veri türleri değil listeler olmalıdır. Koordinatlar kendileri liste veya tuple olabilir. Gerekirse iki girişin sırasını değiştirebilirsiniz.

Tam bir program veya bir işlev yazabilirsiniz. En düşük bayt sayısı kazanır ve standart boşluklara izin verilmez.

Test Durumları

Programınızın tüm geçerli değerleri için bu listeler üzerinde çalışması gerekir 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)]

görsel:

===
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

Yanıtlar:


3

CJam, 77 95 bayt

Bu biraz daha golf olabilir düşünüyorum, ama işte gidiyor:

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

Girdi gibi N <Array of coordinate array>. Örneğin:

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

Çıktı:

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

Algoritma :

Algoritma oldukça basittir ve şöyle devam eder:

  • Giriş koordinat dizisini sıralayın. Bu, koordinatları önce satır sonra sütuna göre sıralar.
  • Şimdi ilk Nnoktaları seçiyoruz
  • Şimdi bu Nnoktalarda azalıyoruz. Hedef son noktadır ve kaynak bu son noktanın kapanma noktasıdır.
  • Sonra en sol üst nokta ile başlıyoruz, bir sonraki noktaya veya doğrudan bir sonraki noktaya kadar sağa (veya sola) yürüyün.
  • Sonra bir sonraki noktaya ulaşmak için yürüyoruz.
  • Aynı sırada yukarıdaki noktaya açık hiçbir noktanın kalmayacağı garanti edilir. Bu, seçilenin başka bir noktasına dokunmamamızı sağlar N. Kapanış noktasını seçmek, ikinci kuralın doğru tutulmasını sağlar.

Buradan çevrimiçi deneyin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.