Javascript 求元素在矩阵中的位置

Javascript 求元素在矩阵中的位置,javascript,algorithm,matrix,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], [1

你有一个矩阵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);
const initMatrix=size=>{
常数矩阵=[];
对于(变量i=0;i{
常数矩阵=初始矩阵(大小);
设nc=尺寸;
设num=1;
对于(设z=0;z=z;i--){
矩阵[nc-1][i]=num;
num++;
}
对于(设i=nc-2;i>=z+1;i--){
矩阵[i][z]=num;
num++;
}
nc--;
}
for(设i=0;i

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

这可以在固定时间内完成。螺旋图如下所示:

要查找给定
步骤的线圈数,需要

ceil(sqrt(steps)/2 - 0.5) - 1                                                (1)
i
-第四级的边长是
2*i+1
,我们从零开始计数

假设
steps=64
,中心是
(5,5)
。应用(1)我们可以发现完整级别的数量是三个,因此我们处于
(8,8+1)=(8,9)
(黑点),我们为它做了
49步。然后,第四层的边长是
2*4+1=9
,所以垂直减去
7
,再减去
8
,我们就没有更多的步骤了,所以最后我们到了
(1,1)

不知何故,这并不奇怪,因为我们通过了square
8x8

函数计算(){
var steps=window.steps.value;

如果(步骤这可以在恒定时间内完成。螺旋图如下所示:

要查找给定
步骤的线圈数,需要

ceil(sqrt(steps)/2 - 0.5) - 1                                                (1)
i
-第四级的边长是
2*i+1
,我们从零开始计数

假设
steps=64
,中心是
(5,5)
。应用(1)可以发现完整级别的数量是三个,因此我们处于
(8,8+1)=(8,9)
(黑点)然后,第4层的边长是
2*4+1=9
,所以垂直减去
7
,垂直减去
8
,我们没有更多的步骤可以使用,所以最后我们到了
(1,1)

不知何故,这并不奇怪,因为我们通过了square
8x8

函数计算(){
var steps=window.steps.value;
如果(步骤)