计算扫雷板的3BV


17

3BV一个的扫雷委员会代表解决了板,如果你已经知道了解决方案所需的左边点击的最低数量。它代表“ Bechtel的董事会基准价值”。这是他的网站对此进行解释。

以下是已解决的扫雷板。标记表示地雷;没有地雷的图块指示相邻地雷的计数,包括对角线,除非应将“ 0”的图块留为空白。该图显示了需要单击哪些瓷砖才能解决木板。

计数3BV

计入3BV的点击次数为:

  • 对于每个空白区域(相邻的零个地雷)及其非空白邻居的洪水泛滥区域之一。
  • 互为非地砖。

另一个例子(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

整数数组可以输入吗?每个整数编码一行。
Karl Napf

@KarlNapf编号。输入应可识别为板,如图所示。
mbomb007 '16

您能否提供更多测试用例,可能包括基于显示图像的输入,以及最大尺寸的测试用例?
英里

Answers:


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值。

这里稍作修改 在Octave中针对没有MATLAB的用户进行了演示

说明

输入矩阵使用的3 x 3矩阵进行扩张1,然后反转(使用~),该矩阵将没有地雷的所有点标识为邻居(1)或do(0)。为了确定连接区域的数量,我们使用bwlabel标记的每个连接区域1。第一输出是标签矩阵(0其中输入是零,并且在范围内的任何值1...N,其中有一个1在输入其中N是所连接的基团的,它属于的索引)。第二个输出是区域数(打开区域所需的点击数)。的结果bwlabel显示在左侧的图像中。

在此处输入图片说明

我们扩大的第一输出bwlabel使用imdilate使用的3×3矩阵(所有非零扩展)1的。结果显示在中间的图像中。

为了确定剩余的点击次数,我们然后计算不在此扩展区域(~imdilate())而非地雷(-x)中的正方形(右侧图片中的白色正方形),然后将其加到开放区域的总数(左侧图片中的不同颜色)以获取3BV。


9

八度,86 84 79 66字节

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

该解决方案创建名为匿名函数ans然后可以被传递的2D矩阵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 。
Suever
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.