Sudo Placement[1.3] | Final Destination
Given an array of integers and a number K with initial and final values. Your task is to find the minimum number of steps required to get final value starting from the initial value using the array elements. You can only do add (add operation % 1000) on values to get the final value. At every step, you are allowed to add any of the array elements with modulus operation.
Examples:
Input: initial = 1, final = 6, a[] = {1, 2, 3, 4}
Output: 2
Step 1: (1 + 1 ) % 1000 = 2.
Step 2: (2 + 4) % 1000 = 6 (which is required final value).
Input: start = 998 end = 2 a[] = {2, 1, 3}
Output: 2
Step 1 : (998 + 2) % 1000 = 0.
Step 2 : (0 + 2) % 1000 = 2.
OR
Step 1 : (998 + 1) % 1000 = 999.
Step 2 : (999 + 3) % 1000 = 2
Approach:
Since in the above problem the modulus given is 1000, therefore the maximum number of states will be 103. All the states can be checked using simple BFS. Initialize an ans[] array with -1 which marks that the state has not been visited. ans[i] stores the number of steps taken to reach i from start. Initially push the start to the queue, then apply BFS.
Pop the top element and check if it is equal to the end if it is then print the ans[end]. If the element is not equal to the topmost element, then add the top element with every element in the array and perform a mod operation with 1000. If the added element state has not been visited previously, then push it into the queue. Initialize ans[pushed_element] by ans[top_element] + 1.
Once all the states are visited, and the state cannot be reached by performing every possible multiplication, then print -1.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int minimumAdditions( int start, int end, int a[], int n)
{
int ans[1001];
memset (ans, -1, sizeof (ans));
int mod = 1000;
queue< int > q;
q.push(start % mod);
ans[start] = 0;
while (!q.empty()) {
int top = q.front();
q.pop();
if (top == end)
return ans[end];
for ( int i = 0; i < n; i++) {
int pushed = top + a[i];
pushed = pushed % mod;
if (ans[pushed] == -1) {
ans[pushed] = ans[top] + 1;
q.push(pushed);
}
}
}
return -1;
}
int main()
{
int start = 998, end = 2;
int a[] = { 2, 1, 3 };
int n = sizeof (a) / sizeof (a[0]);
cout << minimumAdditions(start, end, a, n);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int minimumAdditions( int start,
int end, int a[], int n)
{
int ans[] = new int [ 1001 ];
Arrays.fill(ans, - 1 );
int mod = 1000 ;
Queue<Integer> q = new java.util.LinkedList<>();
q.add(start % mod);
ans[start] = 0 ;
while (!q.isEmpty())
{
int top = q.peek();
q.poll();
if (top == end)
{
return ans[end];
}
for ( int i = 0 ; i < n; i++)
{
int pushed = top + a[i];
pushed = pushed % mod;
if (ans[pushed] == - 1 )
{
ans[pushed] = ans[top] + 1 ;
q.add(pushed);
}
}
}
return - 1 ;
}
public static void main(String[] args)
{
int start = 998 , end = 2 ;
int a[] = { 2 , 1 , 3 };
int n = a.length;
System.out.println(minimumAdditions(start, end, a, n));
}
}
|
Python3
from collections import deque
from typing import List
def minimumAdditions(start: int , end: int ,
a: List [ int ], n: int ) - > int :
ans = [ - 1 ] * 1001
mod = 1000
q = deque()
q.append(start % mod)
ans[start] = 0
while q:
top = q[ 0 ]
q.popleft()
if (top = = end):
return ans[end]
for i in range (n):
pushed = top + a[i]
pushed = pushed % mod
if (ans[pushed] = = - 1 ):
ans[pushed] = ans[top] + 1
q.append(pushed)
return - 1
if __name__ = = "__main__" :
start = 998
end = 2
a = [ 2 , 1 , 3 ]
n = len (a)
print (minimumAdditions(start, end, a, n))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int minimumAdditions( int start,
int end, int []a, int n)
{
int []ans = new int [1001];
for ( int i = 0; i < 1001; i++)
{
ans[i] = -1;
}
int mod = 1000;
Queue< int > q = new Queue< int >();
q.Enqueue(start % mod);
ans[start] = 0;
while (q.Count != 0)
{
int top = q.Peek();
q.Dequeue();
if (top == end)
{
return ans[end];
}
for ( int i = 0; i < n; i++)
{
int pushed = top + a[i];
pushed = pushed % mod;
if (ans[pushed] == -1)
{
ans[pushed] = ans[top] + 1;
q.Enqueue(pushed);
}
}
}
return -1;
}
public static void Main(String[] args)
{
int start = 998, end = 2;
int []a = {2, 1, 3};
int n = a.Length;
Console.WriteLine(minimumAdditions(start, end, a, n));
}
}
|
Javascript
<script>
function minimumAdditions(start,end,a,n)
{
let ans = new Array(1001);
for (let i=0;i<1001;i++)
ans[i]=-1;
let mod = 1000;
let q = [];
q.push(start % mod);
ans[start] = 0;
while (q.length!=0)
{
let top = q[0];
q.shift();
if (top == end)
{
return ans[end];
}
for (let i = 0; i < n; i++)
{
let pushed = top + a[i];
pushed = pushed % mod;
if (ans[pushed] == -1)
{
ans[pushed] = ans[top] + 1;
q.push(pushed);
}
}
}
return -1;
}
let start = 998, end = 2;
let a=[2, 1, 3];
let n = a.length;
document.write(minimumAdditions(start, end, a, n));
</script>
|
Time Complexity: O(N)
Last Updated :
29 Aug, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...