不過 ans[newY][newX] !== undefined 是不是不加也沒關係呢?
因為如果 ans[newY][newX] == undefined 的話,前面的
ans[y][x] + 1 >= ans[newY][newX] 會直接判斷成 false 就能跳過 cotinue 了。

好像是這樣沒錯,我很常會搞混,以為 undefined 變成數字會是 0 XD

但測了一下會變成 NaN,所以 ans[y][x] + 1 >= ans[newY][newX] 的確會變成 false,那以結果來說其實可以不寫

不過如果不寫的話,就其實是依賴程式語言的轉型機制來省掉一個判斷,而這個判斷我覺得其實是有幫助的,所以還是會留下來

先講一下這個解法,ans[y][x] 存的值是:從起點走到 (x, y) 的最短步數,因此 ans[0][0] = 0,其他都初始化成 undefined。有了這個陣列之後,就能夠判斷我們要不要從 (x, y) 走到 (newX, newY) 了,也就是你提的那一段:

if (ans[y][x] + 1 >= ans[newY][newX] && ans[newY][newX] !== undefined) continue

前面那個判斷式:ans[y][x] + 1 >= ans[newY][newX] ,ans[y][x] 是從 (0,0) 走到 (x,y)的最短步數,所以 +1 之後就是:從 (0, 0) 走到 (x, y) 再走到 (newX, newY) 的最短步數

因此這句就是在判斷說:如果我經過 (x,y) 走到 (newX, newY) 的距離比我目前能找到的從 (0,0) 走到 (newX, newY) 的距離還長,那就不應該走(因為走了不會比較好)

不過有個例外,那就是:「如果 (newX, newY) 還沒走過的話」,就應該走,因為沒走過。

其實比較好的方法是把 ans[][] 全部初始化成 Infinity 啦,不然的話就是要多一個這個判斷:&& ans[newY][newX] !== undefined

然後經過你提醒以後發現不用這個也可以,因為 undefined 轉成數字會變 NaN,我原本以為會變 0,如果會變 0 的話就一定要加

Written by

重度拖延症患者,興趣是光想不做,有很多想做的事,卻一件都沒有執行。無聊的時候喜歡寫文章,發現自己好像有把事情講得比其他人清楚的能力。相信分享與交流可以讓世界更美好。Medium 文章列表請參考:https://aszx87410.github.io/blog/medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store