Cod sursa(job #1411797)

Utilizator jurjstyleJurj Andrei jurjstyle Data 31 martie 2015 22:36:32
Problema Generare de permutari Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
/* recursiv
#include <iostream>
#include <fstream>

using namespace std ;

ifstream f("permutari.in");
ofstream g("permutari.out");

int n , x[20], uz[20] ;

int valid(int k) ;
void afisare(int k) ;
void backtracking(int k) ;

int main()
{
 f >> n ;
 backtracking ( 1 ) ;
 return 0 ;
}

void backtracking ( int k )
{
 for ( int i = 1 ; i <= n ; ++i )
    if ( !uz[i] )
        {
          x[k] = i ;
          uz[i] = 1 ;
          if ( k == n )
            afisare ( k ) ;
          else
            backtracking( k + 1 ) ;
          uz[i] = 0 ;
        }
}

int valid( int k )
{
 for ( int i = 1 ; i <= k - 1 ; ++i)
    if ( x[i] == x[k] )
        return 0 ;
 return 1 ;
}


void afisare( int k )
{
 for ( int i = 1 ; i <= k ; ++i )
    g << x[i] << " " ;
 g << "\n" ;
}
*/
// iterativ
#include <iostream>
#include <fstream>

using namespace std ;

ifstream f("permutari.in");
ofstream g("permutari.out");

int main()
{
 int p[100] , n , i , k , poz , min , j ;
 f >> n ;
 for( i = 1 ; i <= n ; ++i )
    p[i] = i ;
 for( i = 1 ; i <= n ; ++i )
    g  << i << " " ;
 g << "\n" ;
 do
 {
   poz = n ;
   while ( p[poz] < p[poz-1] && poz > 1 )
       --poz ;
   --poz ;
   if( poz )
    {
     min = p[poz+1] ;
     j = poz + 1 ;
     for( i = poz + 1 ; i <= n ; ++i )
        if( min > p[i] && p[i] > p[poz] )
            min = p[i] , j = i ;
     k = p[poz] ;
     p[poz] = p[j] ;
     p[j] = k ;
     for( i = 1 ; i <= ( n - poz ) / 2 ; ++i )
        k = p[poz+i] , p[poz+i] = p[n-i+1] , p[n-i+1] = k ;
     for( i = 1 ; i <= n ; ++i )
        g << p[i] << " " ;
     g << "\n" ;
    }
 }while( poz ) ;

}