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

标签 javascript algorithm matrix

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

相关文章:

javascript - JS 随机化 lineTo

asp.net-mvc - Web 的图表编辑器/设计器/向导组件

algorithm - 根据元素的特定属性的计数评估指示一组元素状态的分数

R - 获取两个矩阵具有相同行的行号

javascript - 在原始 JavaScript 中加载 ajax 后将事件(使用动态数据)绑定(bind)到元素的最佳方法

javascript - 打破一个闭包来向外行解释它

javascript - 在我的快速排序中递归

java - 带有唯一字母的子字符串数

matlab - 用其他值替换矩阵中的值

matrix - 在 sympy 中获取矩阵乘法的元素方程