# 【LeetCode】 1306. Jump Game III ## Description > Given an array of non-negative integers `arr`, you are initially positioned at `start` index of the array. When you are at index `i`, you can jump to `i + arr[i]` or `i - arr[i]`, check if you can reach to any index with value 0. > Notice that you can not jump outside of the array at any time. > 給予一個非負整數的陣列 `arr`,你最開始在陣列中索引值為 `start` 的位置。當你在索引值 `i` 時,你可以跳到 `i + arr[i]` 或是 `i - arr[i]`,檢查你是否可以到達任何值為 0 的索引值。 > 注意你任何時候都不該跳出陣列之外。 ## Example: ``` Example 1: Input: arr = [4,2,3,0,3,1,2], start = 5 Output: true Explanation: All possible ways to reach at index 3 with value 0 are: index 5 -> index 4 -> index 1 -> index 3 index 5 -> index 6 -> index 4 -> index 1 -> index 3 ``` ``` Example 2: Input: arr = [4,2,3,0,3,1,2], start = 0 Output: true Explanation: One possible way to reach at index 3 with value 0 is: index 0 -> index 4 -> index 1 -> index 3 ``` ``` Example 3: Input: arr = [3,0,2,1,2], start = 2 Output: false Explanation: There is no way to reach at index 1 with value 0. ``` ## Solution * 一維版本的走迷宮,或是想成圖論中確認兩個 node 之間是否有路徑 * 起點是 `start` * 終點是值為 `0` 的所有點 * 因為不需要求出最短路徑,只需要確定是否可以到達,可以直接用 DFS 求解 * 為了加速,用了一個陣列去存哪些點我已經走過了 * 下面範例 code 使用遞迴解,每個 node 有兩條路可以走(往前或往後),其中一條到達就可以,因此用 OR 連接 ### Code ```C++=1 class Solution { public: bool DFS(vector<bool>& touched, vector<int>& arr, int now) { if(now < 0 || now >= arr.size() || touched[now]) return false; if(arr[now] == 0) return true; touched[now] = true; return DFS(touched, arr, now + arr[now]) || DFS(touched, arr, now - arr[now]); } bool canReach(vector<int>& arr, int start) { vector<bool> touched(arr.size(), false); return DFS(touched, arr, start); } }; ``` ###### tags: `LeetCode` `C++`