## C# || Jump Game III – How To Check If You Can Reach Target Value In Array Using C#

The following is a module with functions which demonstrates how to check if you can reach a target value in an array using C#.

1. Can Reach – Problem Statement

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.

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. ```

2. Can Reach – Solution

The following are two solutions which demonstrates how to check if you can reach a target value in an array.

The following solution uses Depth First Search when looking for the target value.

``` 2. Can Reach - DFS - Solution C# // ============================================================================ // Author: Kenneth Perkins // Date: Dec 8, 2021 // Taken From: http://programmingnotes.org/ // File: Solution.cs // Description: Determines if a target value can be reached in an array // ============================================================================ public class Solution { public bool CanReach(int[] arr, int start) { var visited = new bool[arr.Length]; return DFS(arr, start, visited); } public bool DFS(int[] arr, int currentIndex, bool[] visited) { // Make sure parameters are in bounds if (currentIndex < 0 || currentIndex >= arr.Length) { return false; } // Check to see if the index has been visited if (visited[currentIndex]) { return false; } // Check to see if we found the target value if (arr[currentIndex] == 0) { return true; } // Mark current index as visited visited[currentIndex] = true; // Keep searching forwards and backwards var forwards = currentIndex + arr[currentIndex]; var backwards = currentIndex - arr[currentIndex]; return DFS(arr, backwards, visited) || DFS(arr, forwards, visited); } }// http://programmingnotes.org/ 1234567891011121314151617181920212223242526272829303132333435 // ============================================================================//    Author: Kenneth Perkins//    Date:   Dec 8, 2021//    Taken From: http://programmingnotes.org///    File:  Solution.cs//    Description: Determines if a target value can be reached in an array// ============================================================================public class Solution {    public bool CanReach(int[] arr, int start) {        var visited = new bool[arr.Length];        return DFS(arr, start, visited);    }    public bool DFS(int[] arr, int currentIndex, bool[] visited) {        // Make sure parameters are in bounds        if (currentIndex < 0 || currentIndex >= arr.Length) {            return false;        }        // Check to see if the index has been visited        if (visited[currentIndex]) {            return false;        }        // Check to see if we found the target value        if (arr[currentIndex] == 0) {            return true;        }        // Mark current index as visited        visited[currentIndex] = true;         // Keep searching forwards and backwards        var forwards = currentIndex + arr[currentIndex];        var backwards = currentIndex - arr[currentIndex];         return DFS(arr, backwards, visited) || DFS(arr, forwards, visited);    }}// http://programmingnotes.org/ ```

The following solution uses Breadth First Search when looking for the target value.

``` 2. Can Reach - BFS - Solution C# // ============================================================================ // Author: Kenneth Perkins // Date: Dec 8, 2021 // Taken From: http://programmingnotes.org/ // File: Solution.cs // Description: Determines if a target value can be reached in an array // ============================================================================ public class Solution { public bool CanReach(int[] arr, int start) { var visited = new bool[arr.Length]; var queue = new Queue<int>(); queue.Enqueue(start); while (queue.Count > 0) { var currentIndex = queue.Dequeue(); // Check to see if we found the target value if (arr[currentIndex] == 0) { return true; } // Mark current index as visited visited[currentIndex] = true; // Keep searching forwards and backwards var forwards = currentIndex + arr[currentIndex]; var backwards = currentIndex - arr[currentIndex]; var directions = new List<int>{forwards, backwards}; foreach (var direction in directions) { if (direction >= 0 && direction < arr.Length && !visited[direction]) { queue.Enqueue(direction); } } } return false; } }// http://programmingnotes.org/ 1234567891011121314151617181920212223242526272829303132333435363738 // ============================================================================//    Author: Kenneth Perkins//    Date:   Dec 8, 2021//    Taken From: http://programmingnotes.org///    File:  Solution.cs//    Description: Determines if a target value can be reached in an array// ============================================================================public class Solution {    public bool CanReach(int[] arr, int start) {        var visited = new bool[arr.Length];        var queue = new Queue<int>();         queue.Enqueue(start);         while (queue.Count > 0) {            var currentIndex = queue.Dequeue();             // Check to see if we found the target value            if (arr[currentIndex] == 0) {                return true;            }            // Mark current index as visited            visited[currentIndex] = true;             // Keep searching forwards and backwards            var forwards = currentIndex + arr[currentIndex];            var backwards = currentIndex - arr[currentIndex];            var directions = new List<int>{forwards, backwards};             foreach (var direction in directions) {                if (direction >= 0 && direction < arr.Length && !visited[direction]) {                    queue.Enqueue(direction);                }            }        }        return false;    }}// http://programmingnotes.org/ ```

QUICK NOTES:
The highlighted lines are sections of interest to look out for.

The code is heavily commented, so no further insight is necessary. If you have any questions, feel free to leave a comment below.

Once compiled, you should get this as your output for the example cases:

``` true true false ```