강력한 연결


17

소개

다음 과 같이 하나의 큰 사각형 보드로 정의 된 농장 이 있습니다.

여기에 이미지 설명을 입력하십시오

각 작은 사각형 안의 숫자는 해당 지역의 가치 / 현금 / ...을 나타냅니다.

농부는 연결된 N 사각형 을 찾는 데 도움이 필요합니다 (모든 N 사각형에 공유 경계가 하나 이상 있어야 함) 는 그에게 가장 큰 가치를 부여합니다.

예를 들면 다음과 같습니다.

인 경우 N=1출력은이어야합니다 140.

인 경우 N=6..

여기에 이미지 설명을 입력하십시오

.. 출력은이어야합니다 315.

도전

프로그램 / 함수는 행렬 값 과 숫자 N 을 입력 / 인수로 사용하고 강력한 연결 값을 출력해야합니다 .

이것이 이므로 바이트 단위의 최단 답변이 이깁니다!

입력:

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

산출: 315


입력:

35 -7
-8 36
2

산출: 29


2
이에 대한 일부 무차별 알고리즘은 매우 느릴 수 있습니다. 첫 번째 테스트 사례와 같은 경우 시간에 대한 제한이 있습니까?
Level River St

@steveverrill. 이 도전에 대해서는 시간의 복잡성이 포함되지 않지만, 이것에 답하고 당신의 방법이 무차별적인 힘보다 효율적이라는 것을 증명한다면 나는 기꺼이 당신의 답을 찬성 할 것입니다.
제거

답변:


4

JavaScript (ES6), 190 바이트

(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

설명

행렬을 배열 배열로 취합니다.

각 사각형에서 시작하여 재귀 함수를 사용하여 가능한 모든 조합을 테스트합니다. 이것은 무차별 접근 방식이지만 내 컴퓨터의 첫 번째 테스트 사례에서 거의 즉시 완료됩니다.

(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

테스트

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>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.