Kết nối mạnh mẽ


17

Giới thiệu

Có một đồn điền được xác định bởi một bảng vuông lớn như thế này:

nhập mô tả hình ảnh ở đây

Các số bên trong mỗi ô vuông nhỏ thể hiện giá trị / tiền mặt / ...

Người nông dân cần giúp đỡ để tìm N hình vuông được kết nối (có nghĩa là tất cả N hình vuông nên có ít nhất một đường viền chung) mang lại cho anh ta giá trị lớn nhất.

Ví dụ:

Nếu N=1, thì đầu ra phải được 140.

Nếu N=6, thì ..

nhập mô tả hình ảnh ở đây

.. sản lượng phải được 315.

Thử thách

Chương trình / hàm của bạn phải lấy các giá trị của ma trận và số N làm đầu vào / đối số và phải xuất giá trị của kết nối mạnh mẽ .

Vì đây là , câu trả lời ngắn nhất bằng byte sẽ thắng!

Ví dụ

Đầu vào:

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

Đầu ra: 315


Đầu vào:

35 -7
-8 36
2

Đầu ra: 29


2
Một số thuật toán vũ phu cho việc này có thể rất chậm. Có bất kỳ hạn chế về thời gian cho các trường hợp như trường hợp thử nghiệm đầu tiên?
Cấp sông St

@steveverrill. Đối với thử thách này, không có sự phức tạp về thời gian sẽ được tính, nhưng nếu bạn trả lời điều này và chứng minh rằng phương pháp của bạn hiệu quả hơn so với lực lượng vũ phu, tôi sẽ sẵn lòng nâng cao câu trả lời của bạn.
đã xóa

Câu trả lời:


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

Giải trình

Lấy ma trận như một mảng các mảng.

Bắt đầu từ mỗi ô vuông sau đó sử dụng hàm đệ quy để kiểm tra mọi kết hợp có thể. Đây là một cách tiếp cận mạnh mẽ, nhưng nó hoàn thành gần như ngay lập tức cho trường hợp thử nghiệm đầu tiên trên máy của tôi.

(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

Kiểm tra

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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.