Solutions
Solution 1 (Click to Show/Hide)
function ZigZagMatrix(n) {
// early exit for small input
if (n <= 0)
return [];
else if (n === 1)
return [[0]];
// setup
const matrix = Array(n)
.fill(0)
.map(_ => Array(n).fill(0));
let i = 0, j = 0;
let zig = 0, zag = 0;
// zig-zag through the array
for (let entry = 0; entry < n*n; entry++) {
matrix[i += zig][j += zag] = entry;
if (i === n - 1) { // bottom
matrix[i][++j] = ++entry;
zig = -1, zag = 1;
} else if (j === n - 1) { // right
matrix[++i][j] = ++entry;
zig = 1, zag = -1;
} else if (i === 0) { // top
matrix[i][++j] = ++entry;
zig = 1, zag = -1;
} else if (j === 0) { // left
matrix[++i][j] = ++entry;
zig = -1, zag = 1;
}
}
return matrix;
}