マインスイーパボードの3BVを計算する


17

マインスイーパボードの3BVは、すでに解決策を知っている場合にボードを解くために必要な左クリックの最小数を表します。「Bechtel's Board Benchmark Value」の略です。ここだ彼のサイト、それを説明するには。

以下は、マインスイーパの解決されたボードです。フラグは地雷を示します。地雷のないタイルは、対角線を含め、隣接する地雷の数を示します。ただし、「0」が必要なタイルは代わりに空白のままになります。画像は、ボードを解決するためにクリックする必要があるタイルを示しています。

3BVのカウント

3BVにカウントされるクリックは次のとおりです。

  • 空白のタイル(隣接するゼロの鉱山)とその非空白の隣人の各洪水で満たされたエリア1つ
  • 鉱山以外のタイルごとに1つ。

別の例(3BV = 39)

掃海艇ボードを解決 必要なクリック


値の2D配列を指定すると0、クリアおよび1鉱山(またはブール値)の場合、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

整数の配列は入力として大丈夫ですか?各整数は1行をコード化します。
カールナップ16年

@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)またはdo(0)として識別します。接続されたリージョンの数を決定するために、のbwlabel各接続されたリージョンのラベル付けに使用し1ます。第1の出力は(ラベル行列であり、0入力がゼロと範囲内の任意の値であった1...Nがあった1入力にNそれが属する接続グループのインデックスです)。2番目の出力は、リージョンの数(それらを開くために必要なクリックの数)です。の結果はbwlabel左の画像に示されています。

ここに画像の説明を入力してください

の3 x 3行列を使用して、bwlabel使用の最初の出力を拡張しますimdilate(すべての非ゼロが拡張されます)1。結果は中央の画像に示されています。

残りのクリック数を判断するために、この拡張領域にない正方形(~imdilate())と地雷ではない-x正方形()(右側の画像の白い正方形)をカウントし、これを開いている領域の総数(左側の画像のさまざまな色)3BVを取得します。


9

オクターブ、86 84 79 66バイト

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

このソリューションは、名前の無名関数を作成ans、その後の2次元マトリックス渡すことができる0のと1のを。ロジックは私のMATLABの答えと同じですが、Octaveがスペースを節約するために提供しなければならないいくつかのトリックを使用しています。

このソリューションでは、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 機能が導入されました。
スーバー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.