粘菌は数えることができます!


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整数座標の別の重複のないリストです。粘菌によって形成されたネットワークを表し、次の条件を満たす必要があります。

  • 交点LK正確に大きさを持っていますN
  • セットKは整数グリッドのサブセットとして接続されます(直交または対角隣接を介して)。
  • の座標Kが削除されると、最初の2つの条件を満たさなくなります。

の場合N = 0、出力は空のリストでなければならないことに注意してください。

上記リストの許容出力の一例LN = 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、それぞれxの座標を表しKなくにL。他の出力も受け入れ可能であり、 "tendrils"は可能な限り最短である必要はありません。たとえば、これも許容できるソリューションです。

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

ルール

入力と出力の両方がリストであり、セットや他のデータ型ではありません。座標自体は、リストまたはタプルにすることができます。必要に応じて、2つの入力の順序を変更できます。

完全なプログラムまたは関数を記述できます。最も低いバイト数が優先され、標準の抜け穴は許可されません。

テストケース

プログラムは、のすべての適用可能な値について、これらのリストで機能するはずです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。終点を選択すると、2番目のルールが確実に満たされます。

ここでオンラインでお試しください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.