Sunteți pe pagina 1din 2

//BACKTRACKING 1

/*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);
}

S-ar putea să vă placă și