All pastes #916187 Raw Edit

Stuff

public text v1 · immutable
#916187 ·published 2008-02-24 12:20 UTC
rendered paste body
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

struct fa
 {
  int n;
  fa *kov[51];
  int p[50];
 };

fa gyoker;
ifstream in("nunta.in");
ofstream out("nunta.out");
vector <int> result;

void readData()
{
 if(in)
  {
   in >> gyoker.n;
   for(int i=1;i<=gyoker.n;i++) in >> gyoker.p[i];
  }
 for(int i=1;i<=gyoker.n;i++) gyoker.kov[i]=0;
}

bool vege(fa *l)
{
 if(l->n == 1) return 1; //ha egy kero van akkor a vegere ertunk
  else 
   {
    int i;
    for(i=1;i<= l->n;i++) 
     if(l->kov[i]!=0) break; //leallunk az elso kiterjesztett szintnel
    if (l->kov[i]!=0)
      return vege(l->kov[i]);
       else return false;
  }
}

void kiterjeszt(fa *l)
 {
  if(l->kov[1]==0) 
   {
    for(int i=1;i<=l->n-1;i++) //n-1 szint lessz
     {
      l->kov[i]=new fa();
      l->kov[i]->n = l->n-1; //egy kero ki fog esni
      
      for(int j=1;j<=i-1;j++) l->kov[i]->p[j] = l->p[j];//az elotte levoket atmasoljuk
      
      if(l->p[i]>l->p[i+1])
       {
        l->kov[i]->p[i]=l->p[i] - l->p[i+1]; //ha neki van tobb akkor lefizeti a masikat
       }
        else
         {
          l->kov[i]->p[i]= l->p[i+1] - l->p[i]; //ha neki van kevesebb vagy ugyanannyi,ot fizetik le
         }

      for(int j=i+2;j<=l->n;j++) l->kov[i]->p[j-1] = l->p[j];//az utana levoket is valtozatlanul atmasoljuk
 
      for(int j=1;j<=l->kov[i]->n;j++) l->kov[i]->kov[j] = 0; //ures legyen a kovetkezonek a kovetkezoje is 
     }
   }
    else
     {
      for(int i=1;i<=l->n;i++)
       if (l->kov[i]!=0) kiterjeszt(l->kov[i]);
     }
 }

void getResult(fa *l)
{
 if(l!=0)
  {
   /*cout << l->n<<":";
   for(int i=1;i<=l->n;i++)
    cout << l->p[i];
   cout << "\n";*/
   if(l->n==1)
    { 
     if(find(result.begin(),result.end(),l->p[1])==result.end()) //ha meg nincs benne az eredmenyvektorba
      { 
       //cout << l->p[1];
       result.push_back(l->p[1]);
      }
    }

   if(l->kov[1]!=0)
    {
     for(int i=1;i<=l->n;i++)
      if(l->kov[i]!=0) getResult(l->kov[i]);
    }
  }
}

void writeResult()
{
 out << result.size()<<endl;
 for(int i=0;i<=result.size()-1;i++)
  {
   out << result[i] <<" ";
  }
}

int main()
{
 readData();
 while(!vege(&gyoker))
  {
   kiterjeszt(&gyoker);
  }
 getResult(&gyoker);
 sort(result.begin(),result.end());
 writeResult();
 return 0;
}