偶然看到蛇形矩陣的算法題,以爲比較有趣,想了想,解出來了,而且對算法有了一個新的感知,先看看題目吧,後面談談對算法的感知。算法
輸出以下:spa
1 3 4 10
2 5 9 11
6 8 12 15
7 13 14 16
複製代碼
解題思路:code
因此須要有: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
原本還在想,怎麼算,要不要找公式,後來本身在本子上寫了一下,忽然發現,算法的過程就是將本身寫的過程總結,人在寫這個的時候,會去想,下一個從哪裏開始,寫到哪個上面,而爲何要換個方向,只不過這些邏輯,你由於圖形界面,直接就填入了,而電腦沒有這個概念,只能用代碼把邏輯寫下了,而後進行計算。思考
因此歸根到底,算法是把人腦子裏想法的具體化,用代碼來展現你是怎麼想的。感悟