考虑在W宽x H高的文本网格上绘制一条简单的,开放的二维曲线,其中X
该曲线.
表示曲线的一部分,表示空白,不使用其他任何字符。
每个网格空间都有8个相邻的网格空间,即Moore邻域。边界之外的网格空间被认为是空的。
网格包含曲线,如果有且只有一个X
OR,如果有一个以上的X
地方:
- 正好2个
X
只有一个相邻X
。这些是曲线的端点。 X
除端点外,每个端点都恰好相邻2X
s。这些构成了曲线的主体。
例如,此W = 9而H = 4的网格包含一条曲线:
....X.... .X.X.X.X. X..X..X.X .XX.....X
同样,这些网格(W = 4,H = 3)具有曲线:
.... .X.. .... .... .X.X .... X..X ..X. XX.. X.X. ..X. .XX. .X.. .... ....
但是,这些网格不包含曲线:
.... .XX. ...X XX.. .... X.X. .... X..X ..XX XX.. .X.X .X.. .... .XX. .X.. .... ...X X.X.
我们可以通过将X
s的所有相邻对之间的距离求和来找到曲线的长度:
两个正交相邻的
X
s 之间的距离为1个单位。XX
X X
两个对角相邻的
X
s 之间的距离为√2单位。X. .X
.X X.
例如,网格中曲线的长度
XXX. ...X ..X.
可以可视化为
所以我们可以看到它是1 +1 +√2+√2= 4.828427 ...
只有一个的曲线的长度X
为零。
当网格不形成曲线时,其长度不能很好地定义。
挑战
给定X
s和.
s 的文本网格,输出其包含的曲线的长度,否则输出诸如-1
或的值,Null
以指示网格没有曲线。
输入时X
,.
如果需要,可以使用其他字符,如果需要,可以使用H和W作为输入。以嵌套列表或填充有1和0而不是字符串的矩阵形式输入也可以。
您可以输出曲线长度的浮点数,也可以输出两个整数A和B,其中length = A + B*√2
。
以字节为单位的最短代码获胜。
测试用例
XXX.
...X
..X.
2 + 2*√2 = 4.828427...
....X....
.X.X.X.X.
X..X..X.X
.XX.....X
3 + 8*√2 = 14.313708...
....
....
..X.
0 + 0*√2 = 0
.X..
X..X
.XX.
1 + 3*√2 = 5.242640...
....
..X.
.X..
0 + 1*√2 = 1.414213...
....
XX..
....
1 + 0*√2 = 1
.X.X
X.X.
....
0 + 3*√2 = 4.242640...
....
....
....
....
-1
.XX.
X..X
.XX.
-1
...X
..XX
.X..
-1
....
.X.X
...X
-1
X.X.
.X..
X.X.
-1
[x.x,...,.x.]
不是有效的曲线,对吗?