지뢰 찾기 보드의 3BV 계산

iv id = “의 3BV 368d502a8c “>

지뢰 찾기 보드는 이미 솔루션을 알고있는 경우 보드를 해결하는 데 필요한 최소 왼쪽 클릭 수를 나타냅니다. " Bechtel의 이사회 벤치 마크 값 "을 나타냅니다. 사이트 에서 설명합니다.

아래는 해결 된 지뢰 찾기 보드입니다. 깃발은 지뢰를 나타냅니다. 지뢰가없는 타일은 대각선을 포함하여 인접한 지뢰 수를 나타냅니다. 단, " 0 "가 있어야하는 타일은 대신 공백으로 둡니다. 이미지는 보드를 해결하기 위해 클릭해야하는 타일을 보여줍니다.

3BV 계산

3BV에 집계 된 클릭 수는 다음과 같습니다.

  • 빈 타일 (인접한 광산 0 개)과 비어 있지 않은 이웃의 홍수로 가득 찬 각 영역에 대해 하나씩 .
  • 다른 타일이 아닌 타일.

다른 예 (3BV = 39)

Solved Minesweeper board 필요한 클릭 수


값의 2D 배열이 주어지면 0 지뢰 (또는 부울)의 경우 1, 3BV를 반환 .

보드의 크기는 최소 8×8, 최대 2입니다. 4×30, 포함. 프로그램은 예제뿐만 아니라 가능한 모든 보드를 처리해야합니다.

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

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 

댓글

  • 정수 배열이 입력으로 괜찮습니까? 각 정수는 한 행을 코드합니다.
  • @KarlNapf 아니오. 입력은 표시된대로 보드로 인식 할 수 있어야합니다.
  • 표시된 내용을 기반으로 입력을 포함하여 더 많은 테스트 케이스를 제공 할 수 있습니까? 이미지 및 최대 크기 테스트 케이스일까요?

Answer

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에서 약간 수정 된 데모 입니다.

설명

입력 행렬은 1 “의 3 x 3 행렬을 사용하여 확장 된 다음 반전됩니다 (사용 ~) 지뢰가없는 모든 포인트를 이웃 (1) 또는 수행 (). 연결된 영역의 수를 결정하기 위해 bwlabel를 사용하여 1 “의 연결된 각 영역에 레이블을 지정합니다. 첫 번째 출력은 레이블 매트릭스입니다. (0 여기서 입력은 0이고 1...N 범위의 값은 1 입력에서 N는 해당 그룹이 속한 연결된 그룹의 색인입니다. 두 번째 출력은 영역 수입니다 (열기 위해 필요한 클릭 수). bwlabel의 결과는 왼쪽 이미지에 표시됩니다.

여기에 이미지 설명 입력

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

남은 클릭 수를 확인하기 위해이 확장 영역 (~imdilate())에없는 사각형을 계산합니다. 광산 (-x) (오른쪽 이미지의 흰색 사각형)이 아닌 총 열린 영역 수 (왼쪽 이미지의 다양한 색상 수)에 이것을 추가합니다. )를 사용하여 3BV를 가져옵니다.

Answer

Octave, 86 84 79 66 바이트

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

이 솔루션은 ans라는 익명 함수를 생성합니다. 그런 다음 0 “및 1“의 2D 매트릭스를 전달할 수 있습니다. 논리는 MATLAB 답변과 동일하지만 Octave가 공간을 절약하기 위해 제공해야하는 몇 가지 트릭을 사용합니다.

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

여기에서 데모

Answer

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

@Luis 덕분에 1 바이트 절약

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

MATL 온라인

설명

다시 말하지만 이것은이 질문에 대한 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 불행히도 bwlabeln 기능은 MATL 이후 에 도입되었습니다. 도전이 게시되었습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다