지뢰 찾기 보드의 3BV 계산


17

3BV지뢰 찾기 보드는 이미 해결책을 알고있는 경우 보드를 해결하는 데 필요한 왼쪽 클릭의 최소 수를 나타냅니다. "Bechtel 's Board Benchmark Value"의 약자입니다. 여기 그의 사이트가 그것을 설명하고 있습니다.

아래는 해결 된 지뢰 찾기 보드입니다. 깃발은 광산을 나타냅니다. 광산이없는 타일은 대각선을 포함하여 인접한 광산의 수를 나타냅니다 (단, "0"이 있어야 함). 이미지는 보드를 해결하기 위해 클릭해야 할 타일을 보여줍니다.

3BV 계산

3BV에 대한 클릭 수는 다음과 같습니다.

  • 빈 타일로 된 홍수로 채워진 각 영역 (인접한 제로 광산)과 비어 있지 않은 이웃에 대해 하나씩 .
  • 서로 다른 비광 타일.

다른 예 (3BV = 39)

지뢰 찾기 보드 해결 클릭 필요


0명확하고 1광산 (또는 부울)에 대해 2D 값 배열이 주어지면 3BV를 반환하십시오 .

보드의 크기는 8x8 이상, 24x30 이하입니다. 프로그램은 예제뿐만 아니라 가능한 모든 보드를 처리해야합니다.

참고 : 보드에는 광산 만 포함되지 않습니다.

예제 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

정수 배열이 입력으로 괜찮습니까? 각 정수는 한 행을 코딩합니다.
Karl Napf

@KarlNapf 아니오. 그림과 같이 입력을 보드로 인식 할 수 있어야합니다.
mbomb007

표시된 이미지를 기반으로 한 입력을 포함하여 더 많은 테스트 사례를 제공하고 최대 크기 테스트 사례를 제공 할 수 있습니까?
마일

답변:


15

MATLAB, 92 90 86 83 79 74 72 바이트

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

이 솔루션은 0과 1의 2D 매트릭스 형태로 입력을 받아들이고 제공된 입력에 대한 3BV 값을 표시합니다.

다음은 MATLAB이없는 사용자를 위해 Octave에서 약간 수정 된 데모 입니다.

설명

입력 행렬은의 3 x 3 행렬을 사용하여 확장 된 1다음 ~광산이없는 모든 점을 이웃 ( 1) 또는 수행 ( 0)으로 식별하는 반전 (사용 )됩니다. 연결된 지역의 수를 결정하기 위해 연결된 bwlabel각 지역에 레이블을 지정합니다 1. 제 1 출력은 (라벨 행렬 0입력이 제로이고 범위 값 1...N있었다 1입력에서 N그것이 속하는 연결된 그룹의 인덱스이다). 두 번째 출력은 영역 수 (영역을 여는 데 필요한 클릭 수)입니다. 결과 bwlabel는 왼쪽 이미지에 표시됩니다.

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

의 3 x 3 행렬을 bwlabel사용하여 사용 의 첫 번째 출력을 확장합니다 imdilate(0이 아닌 모든 값이 확장 됨) 1. 결과는 중간 이미지에 표시됩니다.

남은 클릭 수를 확인하기 위해이 확장 영역에없는 제곱 ( ~imdilate())과 광산 ( -x)이 아닌 제곱 (오른쪽 이미지의 흰색 사각형)을 계산하여 총 열린 영역 수 (개 3BV를 얻으려면 왼쪽의 이미지에서 다른 색상을 선택하십시오.


9

옥타브, 86 84 79 66 바이트

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

이 솔루션은의 익명 함수를 생성하여 의 및 의 ans2D 행렬을 전달할 수 있습니다 . 논리는 MATLAB의 대답과 동일하지만 Octave가 공간 절약을 위해 제공해야하는 몇 가지 트릭을 사용합니다.01

이 솔루션을 사용하려면 image패키지가 설치되어 있어야합니다.

여기 데모


2

MATL, 24 22 21 바이트 (비경쟁)

@Luis 덕분에 1 바이트 절약

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

MATL Online 에서 사용해보십시오

설명

다시 말하지만,이 질문에 대한 나의 MATLAB 및 Octave 답변과 유사합니다.

        % 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 

비 경쟁적 이유?
CalculatorFeline

1
@CalculatorFeline 불행히도이 bwlabeln기능은 챌린지가 게시 된 MATL에 도입 되었습니다.
Suever
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.