/*O mare inchisa are n porturi.Sa se determine numarul maxim de itinerare
ce se pot realiza si care sunt aceste itinerare astfel incat: -fiecare itinerar sa contina exact k porturi, k<n -doua itinerare sa nu contina aceleasi k porturi -oricare ar fi doua porturi diferite sa nu existe mai mult de doua itinerare care sa le contina */
#include <stdio.h> #define NMAX 10
void itinerarii(int n,int k) { char m[NMAX][NMAX],t[NMAX-1]; int i=0,j,l,vb,ies,nrit=0; t[i]=0; for(j=0;j<n-1;j++) for(l=j+1;l<n;l++) m[j][l]=0; //matricea m marcheaza de cate ori a fost folosita while(i>=0) //o pereche de porturi { vb=1; while(t[i]<n && vb) { t[i]++; //testam daca itinerarul curent for(j=0;j<i-1;j++) // nu are perechi deja folosite for(l=j+1;l<i;l++) if(m[t[j]-1][t[l]-1]==2) vb=0; if(!vb) { //daca are revenim pentru a alege alt port i--; vb=1; } else { //altfel verificam daca noul port adugat vb=0; //nu face pereche interzisa cu unul din cele existente j=0; for(j=0;j<i && vb;j++) if(m[t[j]-1][t[i]-1]==2) vb=1; } } if(!vb) if(i+1==k) // daca avem k porturi in itinerar, avem o solutie { printf("\n%d: ",++nrit); for(l=0;l<k;l++) printf(" %d",t[l]); for(j=0;j<k-1;j++) for(l=j+1;l<k;l++) //marcam perechile folosite m[t[j]-1][t[l]-1]++; } else { i++; //trecem pt a adauga un nou port t[i]=t[i-1]; } else i--; //revenim la pbt } printf("\nNumarul de itinerarii este %d\n",nrit); }
main() { int n,k; printf("\n\nDati numarul de porturi: ");scanf("%d",&n); printf("Dati numarul de porturi ce trebuie incluse intr-un itinerar: "); scanf("%d",&k); itinerarii(n,k); }