你有一个矩阵 N*N。你通过螺旋从矩阵中移动。既然您知道自己走了多少步,就想知道自己在矩阵中的位置。
输入/输出 [输入]整数大小
房间的大小。
[输入]整数步
您已采取的步数(基于 1)。
[输出]一个整数数组
长度为 2 的数组,描述您在房间中的位置(从 0 开始)。
例子
For size = 5 and steps = 20, the output should be [2, 3].
你的路径可以如下图所示:
[ 1, 2, 3, 4, 5],
[16, 17, 18, 19, 6],
[15, x, x, 20, 7],
[14, x, x, x, 8],
[13, 12, 11, 10, 9]
第 20 步将您带到第二行和第三列(从 0 开始),所以答案是 [2, 3]。
我构建了一个可以为我构建这样的矩阵的解决方案
const initMatrix = size => {
const matrix = [];
for (var i = 0; i < size; i++) {
matrix[i] = new Array(size);
}
return matrix;
};
const blindfolded = (size, steps) => {
const matrix = initMatrix(size);
let nc = size;
let num = 1;
for (let z = 0; z < nc; z++) {
for (let i = z; i < nc; i++) {
matrix[z][i] = num;
num++;
}
for (let i = z + 1; i < nc; i++) {
matrix[i][nc - 1] = num;
num++;
}
for (let i = nc - 2; i >= z; i--) {
matrix[nc - 1][i] = num;
num++;
}
for (let i = nc - 2; i >= z + 1; i--) {
matrix[i][z] = num;
num++;
}
nc--;
}
for (let i = 0; i < matrix.length; i++) {
for (let j = 0; j < matrix[i].length; j++) {
console.log(matrix[i][j]);
}
}
};
blindfolded(7, 1);
但可能应该有另一种更优化的算法
最佳答案
这可以在常数时间内完成。螺旋形如下所示:
要找到给定步数
的线圈数,需要
ceil(sqrt(steps)/2 - 0.5) - 1 (1)
第 i
层的边长是 2*i+1
,我们从零开始计数。
假设 steps = 64
并且中心是 (5,5)
。应用 (1) 可以发现完整级别的数量是三,所以我们在 (8,8+1) = (8,9)
(粗体黑点),我们做了 49
个步骤。那么第4层的边长是2*4+1=9
,所以垂直减去7
,再减去8
,我们不没有更多的步骤要使用,所以我们最终到达了 (1,1)
。
不知何故,这并不奇怪,因为我们经历了正方形 8x8
。
function calc() {
var steps = window.steps.value;
if (steps <= 0) return "must be positive";
var ci = 5, cj = 5;
if (steps == 1) return ci + ", " + cj;
var level = Math.ceil(Math.sqrt(steps)/2 - 0.5) - 1;
var ri = ci + level;
var rj = cj + level + 1;
var sideFull = 2 * level + 1;
steps -= sideFull * sideFull;
var side = sideFull + 2;
{
var verUp = Math.min(steps, side - 2);
steps -= verUp;
ri -= verUp;
}
{
var horLeft = Math.min(steps, side - 1);
steps -= horLeft;
rj -= horLeft;
}
{
var verDown = Math.min(steps, side - 1);
steps += verDown;
ri -= verDown;
}
{
var horRight = Math.min(steps, side - 1);
rj + horRight;
}
return ri + ", " + rj;
}
Center at (5,5), and steps = <input id="steps" />. <button onclick="answer.value = calc();" >Calc</button><br>
Answer: <input id="answer" disabled="disabled" />
关于javascript - 查找元素在矩阵中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57757882/