Combinations where every element appears twice and distance between appearances is equal to the value

2.5

Given a positive number n, we need to find all the combinations of 2*n elements such that every element from 1 to n appears exactly twice and distance between its appearances is exactly equal to value of the element.

Examples:

Input :  n = 3
Output : 3 1 2 1 3 2
         2 3 1 2 1 3
All elements from 1 to 3 appear
twice and distance between two
appearances is equal to value
of the element.

Input :  n = 4
Output : 4 1 3 1 2 4 3 2
         2 3 4 2 1 3 1 4

Explanation

We can use backtracking to solve this problem. The idea is to all possible combinations for the first element and recursively explore remaining element to check if they will lead to the solution or not. If current configuration doesn’t result in solution, we backtrack. Note that an element k can be placed at position i and (i+k+1) in the output array i >= 0 and (i+k+1) < 2*n.
Note that no combination of element is possible for some value of n like 2, 5, 6 etc.

C++

// C++ program to find all combinations where every
// element appears twice and distance between
// appearances is equal to the value
#include <bits/stdc++.h>
using namespace std;

// Find all combinations that satisfies given constraints
void allCombinationsRec(vector<int> &arr, int elem, int n)
{
    // if all elements are filled, print the solution
    if (elem > n)
    {
        for (int i : arr)
            cout << i << " ";
        cout << endl;

        return;
    }

    // try all possible combinations for element elem
    for (int i = 0; i < 2*n; i++)
    {
        // if position i and (i+elem+1) are not occupied
        // in the vector
        if (arr[i] == -1 && (i + elem + 1) < 2*n &&
                arr[i + elem + 1] == -1)
        {
            // place elem at position i and (i+elem+1)
            arr[i] = elem;
            arr[i + elem + 1] = elem;

            // recurse for next element
            allCombinationsRec(arr, elem + 1, n);

            // backtrack (remove elem from position i and (i+elem+1) )
            arr[i] = -1;
            arr[i + elem + 1] = -1;
        }
    }
}

void allCombinations(int n)
{
    // create a vector of double the size of given number with
    vector<int> arr(2*n, -1);

    // all its elements initialized by 1
    int elem = 1;

    // start from element 1
    allCombinationsRec(arr, elem, n);
}

// Driver code
int main()
{
    // given number
    int n = 3;
    allCombinations(n);
    return 0;
}

Java

// Java program to find all combinations where every
// element appears twice and distance between
// appearances is equal to the value

import java.util.Vector;

class Test
{
	// Find all combinations that satisfies given constraints
	static void allCombinationsRec(Vector<Integer> arr, int elem, int n)
	{
	    // if all elements are filled, print the solution
	    if (elem > n)
	    {
	        for (int i : arr)
	            System.out.print(i + " ");
	        System.out.println();
	 
	        return;
	    }
	 
	    // try all possible combinations for element elem
	    for (int i = 0; i < 2*n; i++)
	    {
	        // if position i and (i+elem+1) are not occupied
	        // in the vector
	        if (arr.get(i) == -1 && (i + elem + 1) < 2*n &&
	                arr.get(i + elem + 1) == -1)
	        {
	            // place elem at position i and (i+elem+1)
	            arr.set(i, elem);
	            arr.set(i + elem + 1, elem);
	 
	            // recurse for next element
	            allCombinationsRec(arr, elem + 1, n);
	 
	            // backtrack (remove elem from position i and (i+elem+1) )
	            arr.set(i, -1);
	            arr.set(i + elem + 1, -1);
	        }
	    }
	}
	 
	static void allCombinations(int n)
	{
		
	    // create a vector of double the size of given number with
	    Vector<Integer> arr = new Vector<>();
	    
	    for (int i = 0; i < 2*n; i++) {
			arr.add(-1);
		}
	    
	    // all its elements initialized by 1
	    int elem = 1;
	 
	    // start from element 1
	    allCombinationsRec(arr, elem, n);
	}
	
    // Driver method
    public static void main(String[] args) 
    {
    	// given number
        int n = 3;
        allCombinations(n);
    }
}


Output:

 3 1 2 1 3 2 
 2 3 1 2 1 3 

This article is contributed by Rakesh Kumar. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

GATE CS Corner    Company Wise Coding Practice

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.

Recommended Posts:



2.5 Average Difficulty : 2.5/5.0
Based on 2 vote(s)










Writing code in comment? Please use ide.geeksforgeeks.org, generate link and share the link here.