我的理解是您想要转换一个 n×n 的数组,例如:
[ ['', '', '', '']
, ['', '', '', '']
, ['', '', '', '']
, ['', '', '', ''] ]
转换为:
['','','','','','','','','','','','','','','','']
让我们将原始数组转换为“位置矩阵”,并尝试描绘“之”字形:
[ [[0,0], [0,1], [0,2], [0,3]]
, [[1,0], [1,1], [1,2], [1,3]]
, [[2,0], [2,1], [2,2], [2,3]]
, [[3,0], [3,1], [3,2], [3,3]]
]
如果我们专注于边缘,就可以开始找出一个模式:
[ [0,0]
, [1,0], [0,1]
, [2,0], [0,2]
, [3,0], [0,3]
, [3,1], [1,3]
, [3,2], [2,3]
, [3,3] ]
现在我们需要计算每条边之间的所有 [x,y]
并沿着相反的方向遍历每条边:
const inp1 = zigzag([ ['', '', '', '']
, ['', '', '', '']
, ['', '☝️', '', '']
, ['', '', '', ''] ]);
const inp2 = zigzag([ ['', '', '']
, ['', '', '']
, ['', '☝️', ''] ]);
const inp3 = zigzag([ ['', '']
, ['', ''] ]);
const inp4 = zigzag([ [''] ]);
console.log(`
[${String(inp1)}]
[${String(inp2)}]
[${String(inp3)}]
[${String(inp4)}]
`);
<script>
const zigzag = inp => {
const m = inp.length - 1;
const edges = [];
for (let x = 0; x <= m; x++) edges.push([x, 0]);
for (let x = 1; x <= m; x++) edges.push([m, x]);
return edges.flatMap(([x, y], i) => {
const path = [[x, y]];
for (let a = x, b = y; a != y && b != x;) path.push([--a, ++b]);
return (i % 2 ? path : path.reverse()).map(([x, y]) => inp[x][y]);
});
}
</script>