不過 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 的話就一定要加