算法:蛇形矩阵
2019-01-07 本文已影响0人
卡布奇诺的秘密_Me
偶然看到蛇形矩阵的算法题,觉得比较有趣,想了想,解出来了,并且对算法有了一个新的感知,先看看题目吧,后面谈谈对算法的感知。
输出如下:
1 3 4 10
2 5 9 11
6 8 12 15
7 13 14 16
解题思路:
- m*n的矩阵,一一填入数字,
- 数字填在哪一行哪一列,用x/y来表示,填入之后,计算下一次填入的位置
- 填入方向有向右上,有向左下,需要有一个值来标记方向
所以需要有:
/*
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=1、x=m、y=1、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--;
}
}
}
其实弄清楚什么时候转换方向,就很好理解了。
题目解析结束,谈谈自己的感悟吧。
本来还在想,怎么算,要不要找公式,后来自己在本子上写了一下,突然发现,算法的过程就是将自己写的过程总结,人在写这个的时候,会去想,下一个从哪里开始,写到哪一个上面,而为什么要换个方向,只不过这些逻辑,你因为图形界面,直接就填入了,而电脑没有这个概念,只能用代码把逻辑写下了,然后进行计算。
所以归根到底,算法是把人脑子里想法的具体化,用代码来展示你是怎么想的。