Fill two instances of all numbers from 1 to n in a specific way
Given a number n, create an array of size 2n such that the array contains 2 instances of every number from 1 to n, and the number of elements between two instances of a number i is equal to i. If such a configuration is not possible, then print the same.
Examples:
Input: n = 3
Output: res[] = {3, 1, 2, 1, 3, 2}
Input: n = 2
Output: Not Possible
Input: n = 4
Output: res[] = {4, 1, 3, 1, 2, 4, 3, 2}
We strongly recommend to minimize the browser and try this yourself first.
One solution is to Backtracking. The idea is simple, we place two instances of n at a place, then recur for n-1. If recurrence is successful, we return true, else we backtrack and try placing n at different location. Following is implementation of the idea.
C++
#include <bits/stdc++.h>
using namespace std;
bool fillUtil( int res[], int curr, int n)
{
if (curr == 0)
return true ;
int i;
for (i = 0; i < 2 * n - curr - 1; i++)
{
if (res[i] == 0 && res[i + curr + 1] == 0)
{
res[i] = res[i + curr + 1] = curr;
if (fillUtil(res, curr - 1, n))
return true ;
res[i] = res[i + curr + 1] = 0;
}
}
return false ;
}
void fill( int n)
{
int res[2 * n], i;
for (i = 0; i < 2 * n; i++)
res[i] = 0;
if (fillUtil(res, n, n))
{
for (i = 0; i < 2 * n; i++)
cout << res[i] << " " ;
}
else
cout << "Not Possible" ;
}
int main()
{
fill(7);
return 0;
}
|
C
#include <stdio.h>
#include <stdbool.h>
bool fillUtil( int res[], int curr, int n)
{
if (curr == 0) return true ;
int i;
for (i=0; i<2*n-curr-1; i++)
{
if (res[i] == 0 && res[i + curr + 1] == 0)
{
res[i] = res[i + curr + 1] = curr;
if (fillUtil(res, curr-1, n))
return true ;
res[i] = res[i + curr + 1] = 0;
}
}
return false ;
}
void fill( int n)
{
int res[2*n], i;
for (i=0; i<2*n; i++)
res[i] = 0;
if (fillUtil(res, n, n))
{
for (i=0; i<2*n; i++)
printf ( "%d " , res[i]);
}
else
puts ( "Not Possible" );
}
int main()
{
fill(7);
return 0;
}
|
Java
import java.io.*;
class GFG
{
static boolean fillUtil( int res[], int curr, int n)
{
if (curr == 0 )
return true ;
int i;
for (i = 0 ; i < 2 * n - curr - 1 ; i++)
{
if (res[i] == 0 && res[i + curr + 1 ] == 0 )
{
res[i] = res[i + curr + 1 ] = curr;
if (fillUtil(res, curr - 1 , n))
return true ;
res[i] = res[i + curr + 1 ] = 0 ;
}
}
return false ;
}
static void fill( int n)
{
int res[] = new int [ 2 * n];
int i;
for (i = 0 ; i < 2 * n; i++)
res[i] = 0 ;
if (fillUtil(res, n, n))
{
for (i = 0 ; i < 2 * n; i++)
System.out.print(res[i] + " " );
}
else
System.out.print( "Not Possible" );
}
public static void main (String[] args)
{
fill( 7 );
}
}
|
Python3
def fillUtil(res, curr, n):
if curr = = 0 :
return True
for i in range ( 2 * n - curr - 1 ):
if res[i] = = 0 and res[i + curr + 1 ] = = 0 :
res[i] = res[i + curr + 1 ] = curr
if fillUtil(res, curr - 1 , n):
return True
res[i] = 0
res[i + curr + 1 ] = 0
return False
def fill(n):
res = [ 0 ] * ( 2 * n)
if fillUtil(res, n, n):
for i in range ( 2 * n):
print (res[i], end = ' ' )
print ()
else :
print ( "Not Possible" )
if __name__ = = '__main__' :
fill( 7 )
|
C#
using System;
class GFG
{
static bool fillUtil( int []res, int curr, int n)
{
if (curr == 0)
return true ;
int i;
for (i = 0; i < 2 * n - curr - 1; i++)
{
if (res[i] == 0 && res[i + curr + 1] == 0)
{
res[i] = res[i + curr + 1] = curr;
if (fillUtil(res, curr - 1, n))
return true ;
res[i] = res[i + curr + 1] = 0;
}
}
return false ;
}
static void fill( int n)
{
int []res= new int [2 * n];
int i;
for (i = 0; i < (2 * n); i++)
res[i] = 0;
if (fillUtil(res, n, n))
{
for (i = 0; i < 2 * n; i++)
Console.Write (res[i] + " " );
}
else
Console.Write ( "Not Possible" );
}
static public void Main ()
{
fill(7);
}
}
|
Javascript
<script>
function fillUtil(res, curr, n)
{
if (curr == 0)
return true ;
let i;
for (i = 0; i < 2 * n - curr - 1; i++)
{
if (res[i] == 0 && res[i + curr + 1] == 0)
{
res[i] = res[i + curr + 1] = curr;
if (fillUtil(res, curr - 1, n))
return true ;
res[i] = res[i + curr + 1] = 0;
}
}
return false ;
}
function fill(n)
{
let res= new Array(2 * n);
let i;
for (i = 0; i < (2 * n); i++)
res[i] = 0;
if (fillUtil(res, n, n))
{
for (i = 0; i < 2 * n; i++)
document.write(res[i] + " " );
}
else
document.write( "Not Possible" );
}
fill(7);
</script>
|
Output:
7 3 6 2 5 3 2 4 7 6 5 1 4 1
Time Complexity: O(n^2)
Space complexity: O(n)
The above solution may not be the best possible solution. There seems to be a pattern in the output. I an Looking for a better solution from other geeks.
Last Updated :
06 Feb, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...