Cod sursa(job #109839)

Utilizator Matau_rudiMatau Rudi Alexandru Matau_rudi Data 25 noiembrie 2007 12:48:17
Problema NKPerm Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 11-12 Marime 2.07 kb
#include<iostream.h>
#include<fstream.h>
#include<stdio.h>
int N,K;FILE *h;
struct nod{
long inf;
nod *leg;};
nod *cap1,*cap2;
void adauga_inc(nod *&cap,int x)
{nod *p;
 p=new nod;
 p->inf=x;
 p->leg=cap;
 cap=p;}
void adauga_sf(nod *&cap,int x)
{nod *p,*q;
 if(!cap) adauga_inc(cap,x);
 else {for(p=cap;p->leg!=NULL;p=p->leg);
       q=new nod;
       q->inf=x;
       q->leg=NULL;
       p->leg=q;}
 }
void sterge(nod *&cap2)
{nod *q,*p;
 for(q=cap2;q->leg->leg!=NULL;q=q->leg);
  p=q->leg;
  q->leg=NULL;
  delete p;}
int valid(int i)
{nod *q;int j=1;
 for(q=cap2;q!=NULL;q=q->leg)
  if(q->inf==i) j++;
 for(q=cap2;q->leg!=NULL;q=q->leg);
  if(q->inf==i) return 0;
  if(j>K) return 0;
 return 1;}
void back(int p)
{int i;nod *q;
 for(i=1;i<=N;i++)
  {if(p==0&&i>1) cap2=NULL;
   if(valid(i))
    {adauga_sf(cap2,i);
     if(p==N*K-1) {for(q=cap2;q!=NULL;q=q->leg)
		  {fprintf(h,"%d ",q->inf);}
		  fprintf(h,"\n");}
   back(p+1);}}
   sterge(cap2);
 }
void main()
{cap1=NULL;cap2=NULL;
 ifstream f("c:\\oij\\nkperm.in");
 ofstream g("c:\\oij\\nkperm.out");
 h=fopen("c:\\oij\\fis.txt","w+");
 int T,i,l,j,z,y;char x;nod *p,*q;
 f>>N>>K>>T;
 back(0);
 fclose(h);
 for(i=0;i<T;i++)
 {f>>x;
  if(x=='A') {z=1;
              for(i=0;i<N*K;i++)
	       {f>>l;adauga_sf(cap1,l);}
  for(j=0;j<N*K;j++)
  {fscanf(h,"%d",&l);adauga_sf(cap2,l);}
   while(cap1->inf!=cap2->inf)
   {cap2=NULL;
    for(j=0;j<N*K;j++)
    {fscanf(h,"%d",&l);adauga_sf(cap2,l);}
    z++;}
   p=cap1;q=cap2;
   while(p!=NULL&&q!=NULL)
   {if(p->inf!=q->inf) {cap2=NULL;
                        for(j=0;j<N*K;j++)
			{fscanf(h,"%d",&l);adauga_sf(cap2,l);}
			z++;q=cap2;p=cap1;}
    else {p=p->leg;q=q->leg;}
    }
   g<<z<<endl;cap2=NULL;}
   if(x=='B')
    {f>>y;z=1;
    cap2=NULL;
    for(j=0;j<N*K;j++)
    {fscanf(h,"%d",&l);adauga_sf(cap2,l);}
    while(z!=y)
     {cap2=NULL;
      for(j=0;j<N*K;j++)
      {fscanf(h,"%d",&l);adauga_sf(cap2,l);}
      z++;}
    for(p=cap2;p!=NULL;p=p->leg)
    {g<<p->inf<<" ";}
   g<<endl;cap2=NULL;}
 }
 }