Проверить, можно ли добраться до конца массива из заданной позиции
Для массива arr [] из N натуральных чисел и числа S задача состоит в том, чтобы добраться до конца массива по индексу S. Мы можем только перейти от текущего индекса i к индексу (i + arr [i]) или (i - arr [i]) . Если есть способ добраться до конца массива, то выведите «Да», иначе выведите «Нет» .
Примеры:
Input: arr[] = {4, 1, 3, 2, 5}, S = 1
Output: Yes
Explanation:
initial position: arr[S] = arr[1] = 1.
Jumps to reach the end: 1 -> 4 -> 5
Hence end has been reached.
Input: arr[] = {2, 1, 4, 5}, S = 2
Output: No
Explanation:
initial position: arr[S] = arr[2] = 2.
Possible Jumps to reach the end: 4 -> (index 7) or 4 -> (index -2)
Since both are out of bounds, Hence end can’t be reached.
Подход 1. Эту проблему можно решить с помощью поиска в ширину. Ниже приведены шаги:
- Считайте начальный индекс S как исходный узел и вставьте его в очередь.
- Пока очередь не пуста, сделайте следующее:
- Вытолкнуть элемент из верхней части очереди, скажем, temp .
- Если temp уже посещен или это массив вне привязанного индекса, перейдите к шагу 1.
- В противном случае отметьте его как посещенное.
- Теперь, если temp является последним индексом массива, выведите «Yes» .
- В противном случае возьмите два возможных места назначения от temp до (temp + arr [temp]) , (temp - arr [temp]) и поместите их в очередь.
- Если после вышеперечисленных шагов конец массива не достигнут, выведите «Нет» .
Below is the implementation of the above approach:
C++
// C++ program for the above approach#include <bits/stdc++.h>using namespace std;// Function to check if we can reach to// the end of the arr[] with possible movesvoid solve(int arr[], int n, int start){ // Queue to perform BFS queue<int> q; // Initially all nodes(index) // are not visited. bool visited[n] = { false }; // Initially the end of // the array is not reached bool reached = false; // Push start index in queue q.push(start); // Untill queue becomes empty while (!q.empty()) { // Get the top element int temp = q.front(); // Delete popped element q.pop(); // If the index is already // visited. No need to // traverse it again. if (visited[temp] == true) continue; // Mark temp as visited // if not visited[temp] = true; if (temp == n - 1) { // If reached at the end // of the array then break reached = true; break; } // If temp + arr[temp] and // temp - arr[temp] are in // the index of array if (temp + arr[temp] < n) { q.push(temp + arr[temp]); } if (temp - arr[temp] >= 0) { q.push(temp - arr[temp]); } } // If reaches the end of the array, // Print "Yes" if (reached == true) { cout << "Yes"; } // Else print "No" else { cout << "No"; }}// Driver Codeint main(){ // Given array arr[] int arr[] = { 4, 1, 3, 2, 5 }; // Starting index int S = 1; int N = sizeof(arr) / sizeof(arr[0]); // Function Call solve(arr, N, S); return 0;} |
Java
// Java program for the above approachimport java.util.*;class GFG{// Function to check if we can reach to// the end of the arr[] with possible movesstatic void solve(int arr[], int n, int start){ // Queue to perform BFS Queue<Integer> q = new LinkedList<>(); // Initially all nodes(index) // are not visited. boolean []visited = new boolean[n]; // Initially the end of // the array is not reached boolean reached = false; // Push start index in queue q.add(start); // Untill queue becomes empty while (!q.isEmpty()) { // Get the top element int temp = q.peek(); // Delete popped element q.remove(); // If the index is already // visited. No need to // traverse it again. if (visited[temp] == true) continue; // Mark temp as visited // if not visited[temp] = true; if (temp == n - 1) { // If reached at the end // of the array then break reached = true; break; } // If temp + arr[temp] and // temp - arr[temp] are in // the index of array if (temp + arr[temp] < n) { q.add(temp + arr[temp]); } if (temp - arr[temp] >= 0) { q.add(temp - arr[temp]); } } // If reaches the end of the array, // Print "Yes" if (reached == true) { System.out.print("Yes"); } // Else print "No" else { System.out.print("No"); }}// Driver Codepublic static void main(String[] args){ // Given array arr[] int arr[] = { 4, 1, 3, 2, 5 }; // Starting index int S = 1; int N = arr.length; // Function call solve(arr, N, S);}}// This code is contributed by gauravrajput1 |
Python3
# Python3 program for the above approachfrom queue import Queue # Function to check if we can reach to# the end of the arr[] with possible movesdef solve(arr, n, start): # Queue to perform BFS q = Queue() # Initially all nodes(index) # are not visited. visited = [False] * n # Initially the end of # the array is not reached reached = False # Push start index in queue q.put(start); # Untill queue becomes empty while (not q.empty()): # Get the top element temp = q.get() # If the index is already # visited. No need to # traverse it again. if (visited[temp] == True): continue # Mark temp as visited, if not visited[temp] = True if (temp == n - 1): # If reached at the end # of the array then break reached = True break # If temp + arr[temp] and # temp - arr[temp] are in # the index of array if (temp + arr[temp] < n): q.put(temp + arr[temp]) if (temp - arr[temp] >= 0): q.put(temp - arr[temp]) # If reaches the end of the array, # Print "Yes" if (reached == True): print("Yes") # Else print "No" else: print("No") # Driver codeif __name__ == "__main__": # Given array arr[] arr = [ 4, 1, 3, 2, 5 ] # starting index S = 1 N = len(arr) # Function call solve(arr, N, S) # This code is contributed by himanshu77 |
C#
// C# program for the above approachusing System;using System.Collections.Generic;class GFG{// Function to check if we can reach to// the end of the []arr with possible movesstatic void solve(int []arr, int n, int start){ // Queue to perform BFS Queue<int> q = new Queue<int>(); // Initially all nodes(index) // are not visited. bool []visited = new bool[n]; // Initially the end of // the array is not reached bool reached = false; // Push start index in queue q.Enqueue(start); // Untill queue becomes empty while (q.Count != 0) { // Get the top element int temp = q.Peek(); // Delete popped element q.Dequeue(); // If the index is already // visited. No need to // traverse it again. if (visited[temp] == true) continue; // Mark temp as visited // if not visited[temp] = true; if (temp == n - 1) { // If reached at the end // of the array then break reached = true; break; } // If temp + arr[temp] and // temp - arr[temp] are in // the index of array if (temp + arr[temp] < n) { q.Enqueue(temp + arr[temp]); } if (temp - arr[temp] >= 0) { q.Enqueue(temp - arr[temp]); } } // If reaches the end of the array, // Print "Yes" if (reached == true) { Console.Write("Yes"); } // Else print "No" else { Console.Write("No"); }}// Driver Codepublic static void Main(String[] args){ // Given array []arr int []arr = { 4, 1, 3, 2, 5 }; // Starting index int S = 1; int N = arr.Length; // Function call solve(arr, N, S);}}// This code is contributed by gauravrajput1 |
Yes