gpt4 book ai didi

javascript - 查找元素在矩阵中的位置

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:12:31 24 4
gpt4 key购买 nike

你有一个矩阵 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);

但可能应该有另一种更优化的算法

最佳答案

这可以在常数时间内完成。螺旋形如下所示:

enter image description here

要找到给定步数的线圈数,需要

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com