MATL,54 51 49字节
n:"G~1@(2Y6Z+leG45>1e*5M@)*]vtz:"otY*g]G48-X:*sX>
输入是MATL(AB)格式的2D字符数组,带有;
行分隔符。示例和测试用例中的输入分别是:
['11-011123';'111-010--';'0010---01';'111-01234']
['1']
['1-1-1-1';'-1-1-1-';'2-1-1-1';'-1-1-1-']
['12-45-';'4-65-9';'87-654';'12-487';'45----';'684764']
['111-12';'------';'21--10']
在线尝试!
说明
这通过建立由关系“被连接”定义的图的邻接矩阵来工作。例如,考虑3×4场
52-4
15-8
3-72
使用(主要列)线性索引可以轻松地在MATL中描述2D数组中的条目。在3×4的情况下,每个条目的线性索引为
1 4 7 10
2 5 8 11
3 6 9 12
邻接矩阵是使用矩阵乘法逐步构建的。第一步,考虑直接邻居。例如,索引为3的点是其自身以及索引为2的点的邻居。它不是6的邻居,因为根据该字段,该点不包含数字。在这个例子中的关系“速邻居”的邻接矩阵是12×12矩阵大号给定为
1 1 0 1 0 0 0 0 0 0 0 0
1 1 1 0 1 0 0 0 0 0 0 0
0 1 1 0 0 0 0 0 0 0 0 0
1 0 0 1 1 0 0 0 0 0 0 0
0 1 0 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 1
0 0 0 0 0 0 0 0 0 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1
0 0 0 0 0 0 0 0 1 0 1 1
(可以看到第3列1
在第2行和第3行具有值。)此矩阵始终是对称的,并且其对角线具有1
不包含的点的值-
。
下一步将是“之间最多连接一个点 ”的关系的邻接矩阵。要获得它,只需将L自身相乘并将非零条目设置为即可1
。通常,通过将L提升到代表最大可能路径长度的指数(在矩阵意义上)来获得“通过某条路径连接”的关系的邻接矩阵M。最大路径长度的上限是L中的非零条目数。
直接计算矩阵乘方可能会导致溢出,因为会很快发生大量运算。因此,最好逐步乘以同一矩阵,并在每一步之后将非零项转换为1,以防止大量的累积。
列我的中号表示被(通过任何路径)与连接点点我。现在,可以将level字段按线性顺序简化为列向量c,其中每个条目都包含的对应数字或未定义的值-
。所以在这种情况下,c将是
5
1
3
2
5
-
-
-
7
4
8
2
将M的每一列按c元素方式进行突变,然后计算每一列的总和,则对于每个点i,面积点i的总得分将属于。区域由相互连接的所有点定义。请注意,许多列将产生相同的结果。也就是说,如果点i和j连接在一起(属于同一区域),则列i和j将给出相同的总和。最终结果是这些和的最大值。
% Implicitly take input: 2D char array
n: % Range [1,...,N], where N is number of entries in the input
" % For loop. Each iteration builds a row of matrix L
G % Push input again
~ % Logical negate: transform into matrix of zeros
1 % Push 1, to be written into a matrix entry
@ % Iteration index. Ranges from 1 to N
( % Write that 1 into the N-th entry (linear order)
2Y6 % Push array [0 1 0; 1 1 1; 0 1 0]: mask of immediate neighbours
Z+ % Convolve and keep same-size result
le % Linearize into row array
G45> % Array of same size as the input that contains 1 for numbers, 0 for '-'
1e % Linearize into row array
* % Multiply element-wise
5M % Push last array again: 1 for numbers, 0 for '-'
@) % Get 0 or 1 value of that array corresponding to current iteration
* % Multiply. This is to give a row of zeros for non-numbers
] % End. We have all rows of L in the stack
v % Concatenate all rows into a matrix: L.
tz: % Duplicate. Range [1,...,K], where K is the number of nonzeros in L
" % For loop. Repear K times. This loop computes the 0/1 matrix power
o % Convert matrix entries to double
tY* % Duplicate and matrix-multiply
g % Convert to logical values, that is, nonzero values become 1
] % End. We have matrix M
G48- % Convert input chars to the corresponding numbers by subtractig 48
X: % Linearize into column array. This is vector c
* % Element-wise multiplication with broadcast (implicit repetition)
s % Sum of each column. Gives a row array
X> % Maximum of that row array
% Implicitly display