js实现螺旋矩阵算法

0

Q:用0-9填充一个N*N的矩阵,该矩阵按顺时针旋转方向依次增大,用js编程输出这个数组。要求如下:
图片描述

我的思路是把矩形数组从外到里分为几个环型数组,然后用这些环型数组给二维数组赋值,如图所示:
图片描述

部分代码如下:

function circleNum(n){
    var loop = Math.round(n/2);
    var index = 0;
    for(var j=0;j<loop;j++){
        var arr1 = [];
    for(var i=0;i<4*(n-1);i++){
        var ele = i%10;
        if(index==0){
            arr1.push(ele);
        }else{
            arr1.push(++index);
        }
        
    }
    if(n==1){
    arr1.push(++index);
}
    console.log(arr1);
    n-=2;
    index = arr1[arr1.length-1];
    }
}
circleNum(4);

输出的两个环型数组如下:
图片描述

具体怎么把这些环型数组输出矩阵,这些工作还没完成,最近实在是有点困了,明天再补上。

PS:个人觉得这个思路不是最优解,各位路过的高手如果有更好思路,望不吝赐教。


最近偷懒了,补上完整代码,不过忘了限制数字是0到9,稍微修改一下代码即可。

请输入代码const array = new Array();
let count = -1;
function produceArray(n,start){
if(count==-1){
    count = n;
}

if(start==0){
    for(let i=0;i<n;i++){
      array[i] = [];
      for(let j=0;j<n;j++){
        array[i].push(0);
    }
  }
}

if(count!=2&&count%2==0&&n==2){
    return;
}
if(n==1&&count%2!=0){
    const index = (count-1)/2;
    array[index][index] = count*count-1;
  return;
}


  let increaseNum = start;
  if(n<=0){
  return;
  }
      for(let i=count-n;i<n-1;i++){
      array[i][count-n] = increaseNum++;
  }
  for(let i=count-n;i<n-1;i++){
      array[n-1][i] = increaseNum++;
  }
  for(let i=n-1;i>count-n;i--){    
      array[i][n-1] = increaseNum++;
  }
  for(let i=n-1;i>count-n;i--){
      array[count-n][i] = increaseNum++;
  }
  
  
  produceArray(n-1,increaseNum)
}

produceArray(n,0); //此处可给n赋值即可,比如生成5*5矩阵,n就等于5
for(let i=0;i<array.length;i++){
    console.log(array[i].join(","));
}

图片描述


如果觉得我的文章对你有用,请随意赞赏

你可能感兴趣的

lhstock · 2017年06月13日

不知道你的后续怎么样了。但是感觉这个增加了难度。我觉得应该是二维数组的index变化赋予对应值

回复

0

今天才看到你的留言,已补充完整代码,也更新了一下思路,只不多还是觉得解决方法不优雅,欢迎交流

唐僧洗头爱飘柔 作者 · 2017年07月02日
JingLiii · 2018年07月31日

现在有更加精简的实现吗?在找.

回复

逆风一战九 · 8月23日

var arr = [

[0, 1, 2, 3, 4],
[13, 14, 15, 16, 5],
[12, 19, 18, 17, 6],
[11, 10, 9, 8, 7]
// [0, 1, 2],
// [7, 8, 3],
// [6, 5, 4]

]

function makeArr(martix, result = []) {

if (martix.length == 0) {
    return
}
/**
 *     x1 x2 x3(endX)
 *  y1  1  2  3
 *  y2  8  9  4
 *  y3  7  6  5 
 *  (endY) 
 */
let x = 0,
    y = 0,
    endX = martix[0].length,//初始值就是外层横向的数据长度
    endY = martix.length,
    i,
    total = endX * endY;

while (result.length < total) {
    //上 
    for (i = x; i < endX; i++) {
        result.push(martix[x][i])
    }
    //右
    for (i = y + 1; i < endY; i++) {
        result.push(martix[i][endX - 1])
    }

    //下
    for (i = endX - 2; i >= x; i--) {
        result.push(martix[endY - 1][i])
    }

    // //左
    for (i = endY - 2; i > x; i--) {
        result.push(martix[i][x])
    }

    x++;
    y++;
    endY--;
    endX--;
}

return result

}
console.log(makeArr(arr))

回复

载入中...