# Possible Attack-1

Back Tracking

Medium

#### Problem Statement :

Given `N` integers print all possible combinations.

See original problem statement here

#### Introduction :

Idea is to swap all the values one-by-one and print all different combinations by referring some online programming courses. In a set of `n` elements there are `n!` different permutations. For example, there are six permutations of the set {1,2,3}, namely (1,2,3), (1,3,2), (2,1,3), (2,3,1), (3,1,2), and (3,2,1). #### Description :

We need to explore all the possible combinations which can be solved with backtracking.

Backtracking is the approach to solve the problem by testing all possible combinations. If any subproblem does not fit the given constraint then we discard the complete subproblem (backtrack), moves a step back then try other remaining possible combinations. Backtracking algorithm is generally exponential in time.
>
We will swap every index of the array and then break our problem into subproblems, by recursively calling our function for the next index, when the index becomes equal to the size of the array we print the current combination, every time we swap indices we make sure to revert the changes by swapping them back again to try another combinations (backtrack).

#### backtrack() :

1. If `index == n`, print the current combination.
2. else, for every `k= index` to `n-1` :
• swap(index,k)
• call backtrack(arr,index+1,n)
• swap(index,k) , (Backtrack step).

#### Complexity Analysis :

Total number of permutations are, as discussed earlier, `n!`, and it takes `O(n)` time to print each permutation. Can you guess the final time complexity?

## Solutions:

```#include <stdio.h>

void swap(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}

void backtracking(int a[],int i,int n)
{

if(i==n-1)
{
for(int i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
return;
}

for(int k=i;k<n;k++)
{
swap(&a[k],&a[i]);

backtracking(a,i+1,n);

swap(&a[k],&a[i]); //backtrack
}

}

int main()
{
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++)
scanf("%d",&a[i]);

backtracking(a,0,n);

return 0;
}
```
```#include <bits/stdc++.h>
using namespace std;

void swap(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}

void backtracking(int a[],int i,int n)
{
if(i==n-1)
{
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
return;
}

for(int k=i;k<n;k++)
{
swap(&a[k],&a[i]);

backtracking(a,i+1,n);

swap(&a[k],&a[i]);

}

}

int main()
{
int n;
cin>>n;
int a[n],ans[n];
for(int i=0;i<n;i++)
cin>>a[i];

backtracking(a,0,n);

return 0;
}
```
```import java.util.Scanner;
public class Main
{
static void permute(int[] a, int k)
{
if (k == a.length)
{
for (int i = 0; i < a.length; i++)
{
System.out.print( a[i] + " ");
}
System.out.println();
}
else
{
for (int i = k; i < a.length; i++)

{

int temp = a[k];

a[k] = a[i];

a[i] = temp;
permute(a, k + 1);
temp = a[k];

a[k] = a[i];

a[i] = temp;
}
}
}
public static void main(String args[])
{
Scanner sc = new Scanner(System.in);

int n = sc.nextInt();

int[] sequence = new int[n];

for (int i = 0; i < n; i++)
sequence[i] = sc.nextInt();

permute(sequence, 0);

sc.close();
}
}
```