console.log("Hello world! - js.jsrun.net ");
function spiral2DArray(n, m, step = 1) {
let layer = Math.ceil(Math.min(n, m) / 2);
let layerSum = new Array(layer).fill(0).map((item, k) => {
let now = (n - 2 * k) * (m - 2 * k);
let next = (k + 1) >= layer ? 0 : (n - 2 * (k + 1)) * (m - 2 * (k + 1))
return now - next
})
function isOver(i, j) {
if (i >= n || j >= m) {
console.log('超出范围')
}
return i >= n || j >= m;
}
function getSpiral(i, j) {
let x, y;
x = i < layer ? (i + 1) : (n - i)
y = j < layer ? (j + 1) : (m - j)
return { x, y };
}
function getLayer(i, j) {
if (isOver(i, j)) return;
let { x, y } = getSpiral(i, j);
return Math.min(x, y);
}
function getPosition(i, j) {
if (isOver(i, j)) return;
let layerTh = getLayer(i, j);
let widthLength = m - 2 * (layerTh - 1);
let heightLength = n - 2 * (layerTh - 1) - 2;
let { x, y } = getSpiral(i, j);
if (x <= y && i + 1 == x) {
return j + 1 - x + 1;
}
else if (x <= y) {
return widthLength + heightLength -2*(x + 1) + (widthLength-j-1 );
}
else if (x > y && j + 1 == y) {
return widthLength + widthLength + heightLength + (heightLength + y - i);
}
else if (x > y) {
return widthLength + i - y + 1;
}
}
function getNum(i, j) {
if (isOver(i, j)) return;
let layerTh = getLayer(i, j);
let positionNum = getPosition(i, j);
let res = (layerSum.slice(0, layerTh - 1).reduce((r, c) => r + c, 0) || 0) + positionNum;
return res * step;
}
function getArray() {
let arr = new Array(n).fill(0).map((item) => item = new Array(m).fill(0));
arr.forEach((items, i) => {
arr[i] = items.map((item, j) => {
return getNum(i, j)
})
})
return arr
}
return {
layer,
layerSum,
getLayer,
getPosition,
getNum,
getArray,
};
}
const row = 5, col = 5; step = 1;
let spiralArrayInfo = spiral2DArray(row, col, step);
console.log('二维螺旋数组:', spiralArrayInfo.getArray())
console.log('总圈数:', spiralArrayInfo.layer)
console.log('每一圈的元素个数:', spiralArrayInfo.layerSum)
console.log('2,3坐标处所在的圈数:', spiralArrayInfo.getLayer(2, 3))
console.log('2,3坐标处在它自己所在圈数的相对顺序位置:', spiralArrayInfo.getPosition(2, 3))
console.log('2,3坐标处的值:', spiralArrayInfo.getNum(2, 3))