La connexion puissante

17

introduction

Il y a une plantation définie par un grand carré comme celui-ci:

entrez la description de l'image ici

Les nombres à l'intérieur de chaque petit carré représentent la valeur de sa zone / cash / ...

L'agriculteur a besoin d'aide pour trouver les N carrés connectés (cela signifie que tous les N carrés doivent avoir au moins une frontière partagée) lui donner la plus grande valeur.

Par exemple:

Si N=1, alors la sortie doit être140 .

Si N=6, alors ..

entrez la description de l'image ici

..la sortie doit être 315 .

Défi

Votre programme / fonction doit prendre les valeurs de la matrice et le nombre N comme entrée / arguments et doit sortir la valeur de la connexion puissante .

Puisqu'il s'agit de , la réponse la plus courte en octets gagne!

Exemples

Contribution:

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

Production: 315


Contribution:

35 -7
-8 36
2

Production: 29

supprimé
la source
2
Certains algorithmes de force brute pour cela pourraient être très lents. Y a-t-il des restrictions de temps pour des cas comme le premier cas de test?
Level River St
@steveverrill. Pour ce défi, aucune complexité de temps ne comptera, mais si vous répondez à cela et prouvez que votre méthode est efficacement meilleure que la force brute, je voterai avec plaisir votre réponse.
supprimé le

Réponses:

4

JavaScript (ES6), 190 octets

(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

Explication

Prend la matrice comme un tableau de tableaux.

Commence à partir de chaque carré puis utilise une fonction récursive pour tester toutes les combinaisons possibles. Il s'agit d'une approche par force brute, mais elle se termine presque instantanément pour le premier cas de test sur ma machine.

(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

Tester

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>

user81655
la source