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

iv id = “の 3BV 368d502a8c “>

マインスイーパボードは、すでに解決策を知っている場合に、ボードを解決するために必要な左クリックの最小数を表します。 "ベクテルのボードベンチマーク値"の略です。ここにがあります。サイトで説明しています。

以下は、解決済みのMinesweeperボードです。旗は地雷を示します。地雷のないタイルは、対角線を含む隣接する地雷の数を示します。ただし、" 0 "が必要なタイルは空白のままになります。この画像は、ボードを解決するためにクリックする必要のあるタイルを示しています。

3BVのカウント

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

  • 空白のタイル(隣接するゼロの地雷)とその隣接する空白でないタイルの洪水で満たされた領域ごとに1つ。
  • 鉱山以外のタイルごとに1つ。

別の例(3BV = 39)

解決済みの地雷除去ボード 必要なクリック数


値の2D配列を指定すると、、鉱山(またはブール値)の場合は1は3BVを返します

ボードのサイズは8x8以上、最大2つです。 4x30を含みます。プログラムは、例だけでなく、考えられるすべてのボードを処理する必要があります。

注:ボードに地雷だけが含まれることはありません。

例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行をコード化します。
  • @KarlNapfいいえ。入力は、示されているようにボードとして認識できる必要があります。
  • 表示に基づく入力を含め、さらにテストケースを提供できますか。画像、そしておそらく最大寸法のテストケース?

回答

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の3x 3行列を使用して拡張され、反転されます( ~)は、地雷がないすべてのポイントを隣接として識別します(1)または実行します()。接続された領域の数を決定するには、bwlabelを使用して1の各接続領域にラベルを付けます。最初の出力はラベルマトリックスです。 (0入力がゼロで、1...Nの範囲内の任意の値で1Nは、それが属する接続グループのインデックス)。2番目の出力は、領域の数(領域を開くために必要なクリック数)です。 bwlabelの結果を左の画像に示します。

ここに画像の説明を入力

bwlabelの最初の出力をimdilate1 “の3x 3行列を使用してdiv>(ゼロ以外はすべて展開されます)。結果は中央の画像に表示されます。

残りのクリック数を決定するために、この展開された領域にない正方形をカウントします(~imdilate())地雷ではなく(-x)(右の画像の白い四角)、これを開いている領域の総数(左の画像の異なる色の数)に追加します)3BVを取得します。

回答

オクターブ、 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パッケージがインストールされている必要があります。 。

デモはこちら

回答

MATLAB、 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 の後に導入されました。 チャレンジが投稿されました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です