Listing: CINEMA.CPP #include<stdio.h> #include<mem.h> #include<process.h> int n,a[1001],all2=1,v[1001],total[3],MAX=0; FILE *f; void citire(){ f=fopen("CINEMA.IN","r"); fscanf(f,"%d",&n); for(int i=1;i<=n;i++) fscanf(f,"%d",&a[i]); fclose(f); } void identica(){ memset(v,0,sizeof(v)); int da=1; for(int i=1;i<=n;i++) if(a[i]!=i) da=0; else v[i]=1; if (da){ f=fopen("cinema.out","w"); fprintf(f,"0"); fclose(f); exit(0); } } void gaseste_ciclu(int k){ v[k]=1; int i=a[k],lung=1; while (i!=k) v[i]=1,i=a[i],lung++; if (lung>2) all2=2; total[1]+=lung/2; total[2]+=(lung-1)/2; } void prelucreaza_ciclu(int k){ int c[1001],i=a[k],lung=1; v[k]=1; c[lung]=k; while (i!=k) c[++lung]=i,v[i]=1,i=a[i]; for(i=1;i<=lung/2;i++){ fprintf(f,"%d %d\n",c[i],c[lung-i+1]); int aux=a[c[i]]; a[c[i]]=a[c[lung-i+1]]; a[c[lung-i+1]]=aux; } if (lung>MAX) MAX=lung; } void prelucrare(){ total[1]=total[2]=0; for (int i=1;i<=n;i++) if (!v[i]) gaseste_ciclu(i); f=fopen("cinema.out","w"); fprintf(f,"%d\n",all2); for (int pas=1;pas<=all2;pas++){ fprintf(f,"%d\n",total[pas]); memset(v,0,sizeof(v)); for (i=1;i<=n;i++) if (!v[i]) prelucreaza_ciclu(i); } fclose(f); printf("%d\n",MAX); } void main(){ citire(); identica(); prelucrare(); } [cuprins] |