Güçlü bağlantı


17

Giriş

Bunun gibi büyük bir kare tahta tarafından tanımlanan bir plantasyon var :

resim açıklamasını buraya girin

Her küçük karenin içindeki sayılar, alanının değerini / nakit / ...

Çiftçinin bağlı olan N karelerini bulmak için yardıma ihtiyacı vardır (bu, tüm N karelerinin en az bir paylaşılan kenarlığa sahip olması gerektiği anlamına gelir) ona en büyük değeri verir.

Örneğin:

Eğer N=1öyleyse, çıktı olmalıdır 140.

Eğer N=6öyleyse ..

resim açıklamasını buraya girin

.. çıktı olmalı 315.

Meydan okuma

Programınız / işleviniz matrisin değerlerini ve N sayısını girdi / bağımsız değişkenler olarak almalı ve güçlü bağlantının değerini vermelidir .

Bu olduğundan, bayttaki en kısa cevap kazanır!

Örnekler

Giriş:

10 -7 11 7 3 31
33 31 2 5 121 15
22 -8 12 10 -19 43
12 -4 54 77 -7 -21
2 8 6 -70 109 1
140 3 -98 6 13 20
6

Çıktı: 315


Giriş:

35 -7
-8 36
2

Çıktı: 29


2
Bunun için bazı kaba kuvvet algoritmaları çok yavaş olabilir. İlk test vakası gibi durumlar için zamanında herhangi bir kısıtlama var mı?
Level River St

@steveverrill. Bu zorluk için hiçbir zaman karmaşıklığı sayılmaz, ancak buna cevap verir ve yönteminizin kaba kuvvetten daha iyi olduğunu kanıtlarsanız, cevabınızı memnuniyetle destekleyeceğim.
kaldırıldı

Yanıtlar:


4

JavaScript (ES6), 190 bayt

(m,n)=>m.map((a,r)=>a.map((_,c)=>f(r,c,[0],0)),o=f=(x,y,s,t)=>s[n]?o>t?0:o=t:s.indexOf(w=x+","+y)<0&&m[y]&&(v=m[y][x])<1/0&&f(x+1,y,s=[...s,w],t+=v)+f(x,y+1,s,t)+f(x-1,y,s,t)+f(x,y-1,s,t))|o

açıklama

Matrisi bir dizi dizisi olarak alır.

Her kareden başlar, daha sonra olası her kombinasyonu test etmek için özyinelemeli bir işlev kullanır. Bu kaba kuvvet yaklaşımıdır, ancak makinemdeki ilk test durumu için neredeyse anında biter.

(m,n)=>
  m.map((a,r)=>                 // for each row
    a.map((_,c)=>               // for each column
      f(r,c,[0],0)              // start checking paths from the coordinate of the square
    ),
    o=                          // o = output number (max total)
    f=(x,y,s,t)=>               // recursive function f, x & y = current square, t = total
                                // s = array of used squares (starts as [0] so length = +1)
      s[n]?                     // if we have used n squares
        o>t?0:o=t               // set o to max of o and t
      :s.indexOf(w=x+","+y)<0&& // if the square has not been used yet
      m[y]&&(v=m[y][x])<1/0&&   // and the square is not out of bounds
                                // ( if value of square is less than Infinity )

        // Check each adjacent square
        f(x+1,y,
          s=[...s,w],           // clone and add this square to s
          t+=v                  // add the value of this square to the total
        )
        +f(x,y+1,s,t)
        +f(x-1,y,s,t)
        +f(x,y-1,s,t)
  )
  |o                            // return output

Ölçek

var solution = (m,n)=>m.map((a,r)=>a.map((_,c)=>f(r,c,[0],0)),o=f=(x,y,s,t)=>s[n]?o>t?0:o=t:s.indexOf(w=x+","+y)<0&&m[y]&&(v=m[y][x])<1/0&&f(x+1,y,s=[...s,w],t+=v)+f(x,y+1,s,t)+f(x-1,y,s,t)+f(x,y-1,s,t))|o
<textarea rows="7" cols="40" id="Matrix">10 -7 11 7 3 31
33 31 2 5 121 15
22 -8 12 10 -19 43
12 -4 54 77 -7 -21
2 8 6 -70 109 1
140 3 -98 6 13 20</textarea><br />
N = <input type="number" id="N" value="6" /><br />
<button onclick="result.textContent=solution(Matrix.value.split('\n').map(x=>x.split(' ').map(z=>+z)),N.value)">Go</button>
<pre id="result"></pre>

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.