前言
看過我前幾篇博客的朋友應該有體會,博主是個逗逼+沙雕+中二(重度患者),那時候假酒喝多了,大家見諒。
今天幫朋友用JS寫了一個數組螺旋輸出的代碼實現,寫完之後我自己很滿意,抱着“獨樂樂不如衆樂樂”的思想,貼出來和大家分享分享,也算是爲開源社區做了丁丁大點的貢獻了。
代碼
// 20191221
// 螺旋輸出數組
function rotate(n) {
var down = 1
var up = 2
var left = 3
var right = 4
function goRight(x, y, lap) {
// 可繼續向右
if (y + 1 < n - lap) {
return {
"end": false,
"x": x,
"y": y + 1,
"d": right,
"lap": lap,
}
}
return goDown(x, y, lap)
}
function goDown(x, y, lap) {
// 可繼續向下
if (x + 1 < n - lap) {
return {
"end": false,
"x": x + 1,
"y": y,
"d": down,
"lap": lap,
}
}
return goLeft(x, y, lap)
}
function goLeft(x, y, lap) {
// 可繼續向左
if (y > lap) {
return {
"end": false,
"x": x,
"y": y - 1,
"d": left,
"lap": lap,
}
}
return goUp(x, y, lap)
}
function goUp(x, y, lap) {
// 可繼續向上
if (x - 1 > lap) {
return {
"end": false,
"x": x - 1,
"y": y,
"d": up,
"lap": lap,
}
} else if (x - 1 == lap && y + 1 < n - (lap + 1)) { // 結束了一圈,只能向右邊看看,看是否存在下一圈
return {
"end": false,
"x": x,
"y": y + 1,
"d": right,
"lap": lap + 1,
}
}
return {"end": true}
}
function getNext(x, y, d, lap) {
switch(d) {
case down:return goDown(x, y, lap)
case up: return goUp(x, y, lap)
case left: return goLeft(x, y, lap)
case right: return goRight(x, y, lap)
}
}
if (n > 0) {
var i = 0
var arr = new Array()
var cur = {
"end": false,
"x": 0,
"y": 0,
"d": right,
"lap": 0
}
while (!cur.end) {
arr[i++] = "(" + cur.x + ", " + cur.y + ")"
cur = getNext(cur.x, cur.y, cur.d, cur.lap)
}
return arr
}
return new Array()
}
測試數據&結果
矩陣
(00) (01) (02) (03) (04) (05)
(10) (11) (12) (13) (14) (15)
(20) (21) (22) (23) (24) (25)
(30) (31) (32) (33) (34) (35)
(40) (41) (42) (43) (44) (45)
(50) (51) (52) (53) (54) (55)
n = 1
["(0, 0)"]
n = 2
["(0, 0)", "(0, 1)", "(1, 1)", "(1, 0)"]
n = 3
["(0, 0)", "(0, 1)", "(0, 2)", "(1, 2)", "(2, 2)", "(2, 1)", "(2, 0)", "(1, 0)", "(1, 1)"]
n = 4
["(0, 0)", "(0, 1)", "(0, 2)", "(0, 3)", "(1, 3)", "(2, 3)", "(3, 3)", "(3, 2)", "(3, 1)", "(3, 0)", "(2, 0)", "(1, 0)", "(1, 1)", "(1, 2)", "(2, 2)", "(2, 1)"]
n = 5
["(0, 0)", "(0, 1)", "(0, 2)", "(0, 3)", "(0, 4)", "(1, 4)", "(2, 4)", "(3, 4)", "(4, 4)", "(4, 3)", "(4, 2)", "(4, 1)", "(4, 0)", "(3, 0)", "(2, 0)", "(1, 0)", "(1, 1)", "(1, 2)", "(1, 3)", "(2, 3)", "(3, 3)", "(3, 2)", "(3, 1)", "(2, 1)", "(2, 2)"]
n = 6
["(0, 0)", "(0, 1)", "(0, 2)", "(0, 3)", "(0, 4)", "(0, 5)", "(1, 5)", "(2, 5)", "(3, 5)", "(4, 5)", "(5, 5)", "(5, 4)", "(5, 3)", "(5, 2)", "(5, 1)", "(5, 0)", "(4, 0)", "(3, 0)", "(2, 0)", "(1, 0)", "(1, 1)", "(1, 2)", "(1, 3)", "(1, 4)", "(2, 4)", "(3, 4)", "(4, 4)", "(4, 3)", "(4, 2)", "(4, 1)", "(3, 1)", "(2, 1)", "(2, 2)", "(2, 3)", "(3, 3)", "(3, 2)"]
大致思路
1、類似於迭代,根據當前位置定位下一個位置。
2、函數功能單一化,比如左看右看上看下看。
參考
無參考
寫在後面的話
最近國家查得嚴,我又失戀了,上一個對象有點漏氣。。。
最近我媽喊得嚴,三天兩頭喊我找對象,有帶有閨蜜的女孩紙看到這個博客嗎?我想請你喫飯(瘋狂眨眼暗示)。