ETH官方钱包

前往
大廳
主題

LeetCode - 2849. Determine if a Cell Is Reachable at a Given Time 解題心得

Not In My Back Yard | 2024-11-18 12:00:01 | 巴幣 2 | 人氣 49

題目連結(jié):


題目意譯:
你被給定四個整數(shù) sx 、 sy 、 fx 、fy 以及一個非負(fù)整數(shù) t。

在一個無窮大的二維網(wǎng)格中,你開始於格子 (sx, sy)。在每一秒中,你必須移動到當(dāng)前格子的任意一個相鄰格子。

如果你可以在恰好 t 秒時抵達(dá)格子 (fx, fy),則回傳真(True);反之則回傳假(False)。

一個格子的相鄰格子為至少與其共享一個角的 8 個格子。你可以拜訪同一個格子任意次。

限制:
1 ≦ sx, sy, fx, fy ≦ 10 ^ 9
0 ≦ t ≦ 10 ^ 9



範(fàn)例測資:
範(fàn)例 1:
輸入: sx = 2, sy = 4, fx = 7, fy = 7, t = 6
輸出: true
解釋: 開始於格子 (2, 4),我們可以藉由經(jīng)過上圖表示的格子來在恰好 6 秒時抵達(dá)格子 (7, 7)。

範(fàn)例 2:
輸入: sx = 3, sy = 1, fx = 7, fy = 3, t = 3
輸出: false
解釋: 開始於格子 (3, 1),藉由經(jīng)過上圖表示的格子來抵達(dá)格子 (7, 3) 至少會需要 4 秒。因此我們不可能在 3 秒時抵達(dá)格子 (7, 3)。


解題思維:
令 dx = |sx - fx| 、 dy = |sy - fy|。

可以看到從 (sx, sy) 走到 (fx, fy) 的最少所需秒數(shù)為 max(dx, dy) 秒(令其值為 m)。因為我們一次可以走上下左右以及對角的格子。因此我們最多可以同時讓 dx 和 dy 減一(此時是走對角格子)。其中一者歸零時,剩下就直接走上下左右的格子(此時 dx 和 dy 中只有其中一個會減 1)。

因此如果 m > t,則不可能達(dá)成。因此回傳假。

而如果 m 恰好為 t,則可以看到直接走上述的最短路徑即可。因此回傳真。

那如果 m < t 呢?此時我們只需要在走到 (fx, fy) 的最後一刻前(即最短路徑中的「倒數(shù)第二個格子」),繞著終點轉(zhuǎn)圈圈即可(也就是說可以一直亂走,但是始終與終點相鄰)直到多餘的秒數(shù)消光光。然後最後一秒再走到 (fx, fy) 即可。因此回傳真。



但上面遺漏了一種情況,即起點即終點的狀況(此時 sx == fx 且 sy == fy)。由於在第一秒時根據(jù)題意一定要走出起點(終點),因此如果 t == 1,則不可能抵達(dá)終點;反之,如果 t > 1,則可以仿照上面的策略在終點旁邊繞圈圈來消掉多餘的秒數(shù)並在最後一秒回到終點即可。

因此如果此時 t == 1,則回傳假;反之,回傳真。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創(chuàng)作回應(yīng)

追蹤 創(chuàng)作集

作者相關(guān)創(chuàng)作

相關(guān)創(chuàng)作

更多創(chuàng)作