Given array A[][2] of size N representing co-ordinates and integer D, the task for this problem is to print a binary string of size N whose i’th character is ‘1’ if it is possible to travel from initial co-ordinate to i’th co-ordinate else ‘0’. Start Traversal from first co-ordinate of array A[][2] and Traversal from one co-ordinate (x1, y1) to another co-ordinate (x2, y2) is possible if sqrt((x2​−x1​)2 + (y2 – y1)2​) ≤ D.
Examples:
Input: A[][2] = {{2, -1}, {3, 1}, {8, 8}, {0, 5}}, D = 5 Output: 1101 Explanation:
- The distance between co-ordinate 1 and co-ordinate 2 is square root of 5 which is less than equal to 5, so co-ordinate 2 gets visited.
- Also, the distance between co-ordinate 2 and co-ordinate 4 is square root of 25 which is less than equal to 5, so co-ordinate 4 gets visited.
- co-ordinate 3 has no one within a distance of 5, so it will not get visited.
Input: A[][2] = {{0, 0}, {-1000, -1000}, {1000, 1000}}, D = 1 Output: 100
Approach: To solve the problem follow the below idea:
Depth-First-Search can be used to solve the above problem. We can visualize the co-ordinate-plane as a graph with every co-ordinate as a node.
Below are the steps for the above approach:
- Create an empty string ans.
- Create a visited array vis[N] with all elements initialized to zero.
- Create dfs() function that takes one parameter which is co-ordinate that is being visited:
- Mark it as 1 that is visited vis[i] = 1.
- Iterate all co-ordinates apart from the current and check whether it is unvisited and distance between the co-ordinate that is being iterated and the current co-ordinate is less than equal to D if it is true to call dfs() function for the co-ordinate of the current iteration.
- Call dfs(0, vis, A, N, D) function with initial co-ordinate 0.
- Iterate for i from 0 to N – 1 if vis[i] is equal to 1 push character ‘1‘ in a string else ‘0’.
- return string ans.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void dfs( int v, vector< int >& vis, int A[][2], int N, int D)
{
vis[v] = 1;
for ( int i = 0; i < N; i++) {
if (i == v)
continue ;
int dist = (A[v][0] - A[i][0]) * (A[v][0] - A[i][0])
+ (A[v][1] - A[i][1], 2)
* (A[v][1] - A[i][1], 2);
if (dist <= (D * D) and vis[i] == 0)
dfs(i, vis, A, N, D);
}
}
string canPossibleToVisit( int A[][2], int N, int D)
{
string ans = "" ;
vector< int > vis(N, 0);
dfs(0, vis, A, N, D);
for ( int i = 0; i < N; i++) {
if (vis[i] == 1)
ans.push_back( '1' );
else
ans.push_back( '0' );
}
return ans;
}
int32_t main()
{
int N = 4, D = 5;
int A[][2]
= { { 2, -1 }, { 3, 1 }, { 8, 8 }, { 0, 5 } };
cout << canPossibleToVisit(A, N, D) << endl;
int N1 = 3, D1 = 1;
int A1[][2]
= { { 0, 0 }, { -1000, -1000 }, { 1000, 1000 } };
cout << canPossibleToVisit(A1, N1, D1) << endl;
return 0;
}
|
Java
import java.util.ArrayList;
import java.util.List;
public class GFG {
static void dfs( int v, List<Integer> vis, int [][] A, int N, int D) {
vis.set(v, 1 );
for ( int i = 0 ; i < N; i++) {
if (i == v) {
continue ;
}
int dist = (A[v][ 0 ] - A[i][ 0 ]) * (A[v][ 0 ] - A[i][ 0 ]) +
(A[v][ 1 ] - A[i][ 1 ]) * (A[v][ 1 ] - A[i][ 1 ]);
if (dist <= (D * D) && vis.get(i) == 0 ) {
dfs(i, vis, A, N, D);
}
}
}
static String canPossibleToVisit( int [][] A, int N, int D) {
StringBuilder ans = new StringBuilder();
List<Integer> vis = new ArrayList<>(N);
for ( int i = 0 ; i < N; i++) {
vis.add( 0 );
}
dfs( 0 , vis, A, N, D);
for ( int i = 0 ; i < N; i++) {
if (vis.get(i) == 1 ) {
ans.append( '1' );
} else {
ans.append( '0' );
}
}
return ans.toString();
}
public static void main(String[] args) {
int N = 4 , D = 5 ;
int [][] A = { { 2 , - 1 }, { 3 , 1 }, { 8 , 8 }, { 0 , 5 } };
System.out.println(canPossibleToVisit(A, N, D));
int N1 = 3 , D1 = 1 ;
int [][] A1 = { { 0 , 0 }, { - 1000 , - 1000 }, { 1000 , 1000 } };
System.out.println(canPossibleToVisit(A1, N1, D1));
}
}
|
Python3
def dfs(v, vis, A, N, D):
vis[v] = 1
for i in range (N):
if i = = v:
continue
dist = (A[v][ 0 ] - A[i][ 0 ]) * * 2 + (A[v][ 1 ] - A[i][ 1 ]) * * 2
if dist < = D * * 2 and vis[i] = = 0 :
dfs(i, vis, A, N, D)
def canPossibleToVisit(A, N, D):
ans = ""
vis = [ 0 ] * N
dfs( 0 , vis, A, N, D)
for i in range (N):
if vis[i] = = 1 :
ans + = '1'
else :
ans + = '0'
return ans
if __name__ = = "__main__" :
N, D = 4 , 5
A = [[ 2 , - 1 ], [ 3 , 1 ], [ 8 , 8 ], [ 0 , 5 ]]
print (canPossibleToVisit(A, N, D))
N1, D1 = 3 , 1
A1 = [[ 0 , 0 ], [ - 1000 , - 1000 ], [ 1000 , 1000 ]]
print (canPossibleToVisit(A1, N1, D1))
|
C#
using System;
using System.Collections.Generic;
public class GFG {
static void dfs( int v, List< int > vis, int [, ] A, int N,
int D)
{
vis[v] = 1;
for ( int i = 0; i < N; i++) {
if (i == v)
continue ;
int dist
= (A[v, 0] - A[i, 0]) * (A[v, 0] - A[i, 0])
+ (A[v, 1] - A[i, 1])
* (A[v, 1] - A[i, 1]);
if (dist <= (D * D) && vis[i] == 0)
dfs(i, vis, A, N, D);
}
}
static string CanPossibleToVisit( int [, ] A, int N,
int D)
{
string ans = "" ;
List< int > vis = new List< int >( new int [N]);
dfs(0, vis, A, N, D);
for ( int i = 0; i < N; i++) {
if (vis[i] == 1)
ans += "1" ;
else
ans += "0" ;
}
return ans;
}
static void Main( string [] args)
{
int N = 4, D = 5;
int [, ] A
= { { 2, -1 }, { 3, 1 }, { 8, 8 }, { 0, 5 } };
Console.WriteLine(CanPossibleToVisit(A, N, D));
int N1 = 3, D1 = 1;
int [, ] A1 = { { 0, 0 },
{ -1000, -1000 },
{ 1000, 1000 } };
Console.WriteLine(CanPossibleToVisit(A1, N1, D1));
}
}
|
Javascript
function dfs(v, vis, A, N, D) {
vis[v] = 1;
for (let i = 0; i < N; i++) {
if (i === v)
continue ;
let dist =
(A[v][0] - A[i][0]) * (A[v][0] - A[i][0]) +
(A[v][1] - A[i][1]) * (A[v][1] - A[i][1]);
if (dist <= D * D && vis[i] === 0)
dfs(i, vis, A, N, D);
}
}
function canPossibleToVisit(A, N, D) {
let ans = "" ;
let vis = Array(N).fill(0);
dfs(0, vis, A, N, D);
for (let i = 0; i < N; i++) {
if (vis[i] === 1)
ans += '1' ;
else
ans += '0' ;
}
return ans;
}
let N = 4, D = 5;
let A = [[2, -1], [3, 1], [8, 8], [0, 5]];
console.log(canPossibleToVisit(A, N, D) + "<br/>" );
let N1 = 3, D1 = 1;
let A1 = [[0, 0], [-1000, -1000], [1000, 1000]];
console.log(canPossibleToVisit(A1, N1, D1));
|
Time Complexity: O(N * N) Auxiliary Space: O(N)
Related Articles:
|