Koneksi yang kuat

17

pengantar

Ada perkebunan yang didefinisikan oleh satu papan persegi besar seperti ini:

masukkan deskripsi gambar di sini

Angka-angka di dalam setiap kotak kecil mewakili nilai area / uang tunai / ...

Petani membutuhkan bantuan untuk menemukan kotak N yang terhubung (itu berarti semua kotak N harus memiliki setidaknya satu perbatasan bersama) memberinya nilai terbesar.

Sebagai contoh:

Jika N=1, maka outputnya harus 140.

Kalau N=6begitu ..

masukkan deskripsi gambar di sini

..suatu output harus 315.

Tantangan

Program / fungsi Anda harus mengambil nilai-nilai matriks dan angka N sebagai input / argumen dan harus menampilkan nilai koneksi yang kuat .

Karena ini adalah , jawaban tersingkat dalam byte menang!

Contohnya

Memasukkan:

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

Keluaran: 315


Memasukkan:

35 -7
-8 36
2

Keluaran: 29

dihapus
sumber
2
Beberapa algoritma brute force untuk ini bisa sangat lambat. Apakah ada batasan waktu untuk kasus seperti kasus uji pertama?
Level River St
@steveverrill. Untuk tantangan ini, tidak ada kompleksitas waktu yang akan dihitung, tetapi jika Anda menjawab ini dan membuktikan bahwa metode Anda secara efisien lebih baik daripada kekerasan, saya dengan senang hati akan meningkatkan jawaban Anda.
dihapus

Jawaban:

4

JavaScript (ES6), 190 byte

(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

Penjelasan

Mengambil matriks sebagai array array.

Mulai dari setiap kotak kemudian menggunakan fungsi rekursif untuk menguji setiap kemungkinan kombinasi. Ini adalah pendekatan brute-force, tetapi hampir selesai secara instan untuk test case pertama pada mesin saya.

(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

Uji

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>

pengguna81655
sumber