算法:蛇形矩阵

偶然看到蛇形矩阵的算法题,以为比较有趣,想了想,解出来了,而且对算法有了一个新的感知,先看看题目吧,后面谈谈对算法的感知。算法


输出以下:spa

1   3   4   10
2   5   9   11
6   8   12  15
7   13  14  16
复制代码

解题思路:code

  1. m*n的矩阵,一一填入数字,
  2. 数字填在哪一行哪一列,用x/y来表示,填入以后,计算下一次填入的位置
  3. 填入方向有向右上,有向左下,须要有一个值来标记方向

因此须要有:class

/* m、y:有m行n列 x、y:填x行第y个 right:是否向右上 1:右上 0:左下 */
let m = n = 4;
let x = y = 1;
let right = 0;
let arr = [];
for (let i = 0; i < m; i++) {
  arr[i] = [];
}
复制代码

须要思考的: 填入有右上、左下的方向,何时改变填入的方向? 边缘位置,x=一、x=m、y=一、y = n 的时候。循环

因此循环代码以下:总结

for (let i = 1; i <= m * n; i++) {
  // 填充数据
  arr[x - 1][y - 1] = i;

  if (right) {
    if (x === 1 || y + 1 > n) {
      // 边缘时改变方向
      right = 0;
      if (y + 1 > n) {
        // 最右处则填入下一行
        x++;
      } else {
        // 非最右处则填入下一列
        y++;
      }
    } else {
      x--;
      y++;
    }
  } else {
    if (y === 1 || x + 1 > m) {
      // 边缘时改变方向
      right = 1;
      if (x + 1 > m) {
        // 最底处则填入下一列
        y++;
      } else {
        // 非最底处则填入下一行
        x++;
      }
    } else {
      x++;
      y--;
    }
  }
}
复制代码

其实弄清楚何时转换方向,就很好理解了。数据

题目解析结束,谈谈本身的感悟吧。word


原本还在想,怎么算,要不要找公式,后来本身在本子上写了一下,忽然发现,算法的过程就是将本身写的过程总结,人在写这个的时候,会去想,下一个从哪里开始,写到哪个上面,而为何要换个方向,只不过这些逻辑,你由于图形界面,直接就填入了,而电脑没有这个概念,只能用代码把逻辑写下了,而后进行计算。思考

因此归根到底,算法是把人脑子里想法的具体化,用代码来展现你是怎么想的。感悟

相关文章
相关标签/搜索