La poderosa conexión


17

Introducción

Hay una plantación definida por un gran tablero cuadrado como este:

ingrese la descripción de la imagen aquí

Los números dentro de cada cuadrado pequeño representan el valor de su área / efectivo / ...

El agricultor necesita ayuda para encontrar los N cuadrados que se conectan (esto significa que todos los N cuadrados deben tener al menos un borde compartido) para darle el mayor valor.

Por ejemplo:

Si N=1, entonces la salida debe ser 140.

Si N=6, entonces ..

ingrese la descripción de la imagen aquí

... la salida debe ser 315.

Desafío

Su programa / función debe tomar los valores de la matriz y el número N como entrada / argumentos y debe generar el valor de la conexión poderosa .

Como se trata de , ¡la respuesta más corta en bytes gana!

Ejemplos

Entrada:

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

Salida: 315


Entrada:

35 -7
-8 36
2

Salida: 29


2
Algunos algoritmos de fuerza bruta para esto podrían ser muy lentos. ¿Existen restricciones de tiempo para casos como el primer caso de prueba?
Level River St el

@steveverrill. Para este desafío, no contará la complejidad del tiempo, pero si responde esto y demuestra que su método es eficientemente mejor que la fuerza bruta, con gusto votaré su respuesta.
eliminado

Respuestas:


4

JavaScript (ES6), 190 bytes

(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

Explicación

Toma la matriz como una matriz de matrices.

Comienza desde cada cuadrado y luego usa una función recursiva para probar cada combinación posible. Este es un enfoque de fuerza bruta, pero termina casi instantáneamente para el primer caso de prueba en mi máquina.

(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

Prueba

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>

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.