/* 
   Laboratorium Praktyki Programowania  
   Program przykładowy 
*/


/* Należy pozostawić definicję tylko jednej ze stałych : */

/* dla nowszych kompilatorów */
#define ANSI

/* dla starszych kompilatorów */
//#define ARM


#ifdef ANSI
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
#endif

#ifdef ARM
#include <iostream.h>
#include <string.h>
#include <stdlib.h>

#endif




// Wpisanie zbyt dlugiego ciagu nie polecane :)

// funkcja generujaca permutacje z argumentem domyslnym
void permutacje(char *,int =0);


int main(){
  char Tablica[100];

  cout << " Podaj ciag znakow" <<endl;
  cin.getline(Tablica,100);

  cout << "Permutacje " << Tablica <<" to :\n";

  permutacje(Tablica);

  return 0;
}


void zamien(char& x, char& y){
  char p=x;
  x=y;
  y=p;
}

// funkcja wypisujaca permutacje zadanej tablicy
// parametr T to tablica do spermutowania, n - il. el.
// index, to nr od ktorego nalezy zaczac permutowanie
void permutacje(char *T,int index){

  int i;
  int L=strlen(T);



  // jesli jest index to ost. element, to wypisz tablice
  // (jest tylko 1 permutacja ost. elementu)
  if ( index==L ) {
	cout << T << endl;
  }
  else {

    for ( i=index; i<L ; i++ ){
      // Wstaw w miejsce index i-ty element tablicy
      zamien(T[index],T[i]);
      // wygeneruj wszystkie permutacje dalszej czesci tablicy
      permutacje(T,index+1);
      // spowrotem zamien elementy
      zamien(T[i],T[index]);
    }
    
    
  }
}



