Tính toán 3BV của Ban Minesweeper


17

Các 3BV của một Minesweeper ban đại diện cho số nhấp chuột tối thiểu trái cần thiết để giải quyết hội đồng quản trị nếu bạn đã biết các giải pháp. Nó là viết tắt của "Giá trị điểm chuẩn hội đồng quản trị của Bechtel". Đây là trang web của anh ấy giải thích nó.

Dưới đây là một bảng Minesweeper đã giải quyết. Các cờ chỉ ra các mỏ; gạch không có mỏ cho biết số lượng mỏ liền kề, bao gồm cả đường chéo, ngoại trừ gạch phải có "0" được để trống thay thế. Hình ảnh cho thấy gạch nào cần phải được bấm để giải quyết bảng.

Đếm 3BV

Các nhấp chuột được tính vào 3BV là:

  • Một cho mỗi khu vực đầy gạch trống (không có mỏ liền kề) và hàng xóm không trống của họ.
  • Một cho nhau gạch không phải của tôi.

Một ví dụ khác (3BV = 39)

Giải quyết bảng Minesweeper Nhấp chuột cần thiết


Đưa ra một mảng các giá trị 2D, 0rõ ràng và 1cho một mỏ (hoặc boolean), trả về 3BV .

Kích thước của một bảng sẽ có ít nhất là 8x8 và bao gồm tối đa 24x30. Chương trình của bạn nên xử lý tất cả các bảng có thể, không chỉ các ví dụ.

Lưu ý: Một bảng sẽ không bao giờ chỉ chứa các mỏ.

Ví dụ I / O:

[[0,0,0,0,0,0,0,0],
[0,0,0,1,0,0,0,0],
[0,0,0,1,0,0,1,0],
[0,1,0,0,1,0,0,0],
[0,0,1,0,0,0,0,1],
[0,0,0,1,0,0,0,0],
[0,0,0,0,0,0,1,0],
[0,0,0,0,0,0,0,1]]

23

[[0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0],
[0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,1,0,1,1,0,0,0,0,0,0],
[0,1,0,0,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,1,0,0,0,1,0,1,0,1,0],
[0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0],
[0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1,0,1],
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1],
[0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0],
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0],
[0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0],
[1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1],
[0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,1,0,0,0,0,1,1,0,0],
[0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,0,1,1,0,0,0,1,0,0,0,1,1,0,0],
[0,1,1,1,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0],
[0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0],
[0,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0]]

187

Là một mảng các số nguyên có ổn như đầu vào không? Mỗi số nguyên mã một hàng.
Karl Napf

@KarlNapf Không. Đầu vào phải được nhận dạng dưới dạng bảng như được hiển thị.
mbomb007

Bạn có thể cung cấp thêm các trường hợp thử nghiệm, có thể bao gồm đầu vào dựa trên hình ảnh được hiển thị và có thể là trường hợp thử nghiệm kích thước tối đa không?
dặm

Câu trả lời:


15

MATLAB, 92 90 86 83 79 74 72 byte

x=input('');I=@(x)~imdilate(x,ones(3));[C,N]=bwlabel(I(x));nnz(I(C)-x)+N

Giải pháp này chấp nhận đầu vào dưới dạng ma trận 2D 0 và 1 và sẽ hiển thị giá trị 3BV cho đầu vào được cung cấp.

Đây là bản demo được sửa đổi một chút trong Octave cho những bạn không có MATLAB.

Giải trình

Ma trận đầu vào được mở rộng bằng cách sử dụng ma trận 3 x 3 1và sau đó đảo ngược (sử dụng ~) để xác định tất cả các điểm không có mỏ là hàng xóm ( 1) hoặc do ( 0). Để xác định số lượng vùng được kết nối, chúng tôi sử dụng bwlabelđể gắn nhãn cho từng vùng được kết nối của 1. Đầu ra đầu tiên là ma trận nhãn ( 0trong đó đầu vào bằng 0 và bất kỳ giá trị nào trong phạm vi 1...N1đầu vào trong đó Nchỉ mục của nhóm được kết nối mà nó thuộc về). Đầu ra thứ hai là số vùng (số lần nhấp cần thiết để mở chúng). Kết quả của bwlabelđược hiển thị trong hình ảnh bên trái.

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

Chúng tôi mở rộng đầu ra đầu tiên của bwlabelviệc sử dụng imdilate(tất cả các số không được mở rộng) bằng cách sử dụng ma trận 3 x 3 1. Kết quả được hiển thị trong hình ảnh ở giữa.

Để xác định các nhấp chuột còn lại, sau đó chúng tôi đếm các ô vuông không nằm trong vùng mở rộng này ( ~imdilate()) và không phải là mỏ ( -x) (hình vuông màu trắng trong hình bên phải) và thêm số này vào tổng số vùng mở (số lượng màu sắc khác nhau trong hình ảnh bên trái) để có được 3BV.


9

Octave, 86 84 79 66 byte

@(x)nnz(~imdilate(c=imerode(~x,o=ones(3)),o)-x)+max(bwlabel(c)(:))

Giải pháp này tạo ra một hàm ẩn danh có tên ansmà sau đó có thể được truyền một ma trận 2D gồm 0các và 1. Logic giống như câu trả lời MATLAB của tôi nhưng sử dụng một vài thủ thuật mà Octave phải cung cấp để tiết kiệm không gian.

Giải pháp này yêu cầu imagegói được cài đặt.

Demo tại đây


2

MATL, 24 22 21 byte (không cạnh tranh)

Lưu 1 byte nhờ @Luis

4Y6Z+~l2#ZIw7MZ+G+~z+

Dùng thử tại MATL Online

Giải trình

Một lần nữa, điều này tương tự với câu trả lời MATLAB và Octave của tôi cho câu hỏi này.

        % Implicitly grab input array
4Y6     % Push the literal [1 1 1; 1 1 1; 1 1 1] to the stack
Z+      % Perform 2D convolution of the input with this array
~       % Negate the result
l2#ZI   % Call bwlabeln which dilates each open region and the second output
        % returns the number of open regions
w       % Flip the top two stack elements
7M      % Push the literal [1 1 1; 1 1 1; 1 1 1] to the stack again
Z+      % Perform 2D convolution
G+      % Explicitly grab the input and add it to the result
~z      % Count the number of 0's in the result (the remaining number of clicks)
+       % Add the total number of remaining clicks to the number of open regions 

Không biên dịch tại sao?
Máy

1
@CalculatorFeline Thật không may, bwlabelnchức năng đã được giới thiệu cho MATL sau khi thử thách được đăng.
Suever
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.