Documente Academic
Documente Profesional
Documente Cultură
Laborator 2
Descriere: Backtracking - 2
1. Problema labirintului
Se dă un labirint sub forma unei matrici cu m linii şi n coloane. Fiecare element al matricei
reprezintă o cameră. Într-una din camerele labirintului se găseşte un om. Se cere să se afle toate
soluţiile de ieşire din labirint, fără să treacă de două ori prin aceeaşi cameră. Fiecare cameră are
pereţi proprii şi se poate trece dintr-o cameră în alta, numai dacă între cele două camere nu există
perete. Deplasarea prin labirint se poate face doar mergând în sus, în jos, la stânga sau la dreapta,
nu şi în diagonală.
System.out.println();
}
}
2. Colorarea hartilor
Fiind data o harta cu n tari, se cer toate posibilitatile de a colora o harta, utilizand 4 culori
(rosu,galben,verde,albastru) a.i, doua tari vecine sa nu fie colorate la fel. De exemplu, avem
urmatoarea harta cu 7 tari si o solutie posibila de colorare.
0 1
4
2 3
6
5
Harta este reprezentata cu ajutorul unei matrici patratice. Pentru fiecare linie i (reprezentand tara i)
avem j coloane (1 = daca se invecineaza cu tara j, 0 = daca nu se invecineaza cu tara j). Pentru
exemplul de mai sus avem urmatoarea matrice (va fi salvata intr-un fisier harta.in).
0,1,1,0,1,1,0
1,0,0,0,1,1,1
1,1,0,1,1,1,1
0,0,1,0,1,0,1
1,1,1,1,0,0,1
1,1,1,0,0,0,1
0,1,1,1,1,1,0
Rezultatul va fi salvat intr-un fisier harta.out si va fi codificat sub forma unui vector in care fiecare
element i va avea valoarea 1 (rosu), 2 (galben), 3(verde) sau 4 (albastru).
import java.util.*;
Vector stiva;
static int n;
static boolean as,ev;
ASD
if(as){
if(solutie()) tipar();
else initS();
}
else stiva.removeElementAt( stiva.size()-1 );
}
ASD
System.out.println("Sfarsit generare");
}
Sa se afiseze toate modurile de descompunere a unui numar natural n ca suma de numere naturale.
import java.util.*;
Vector stiva;
static int n;
static boolean as,ev;
Integer el = (Integer)stiva.elementAt(i);
s+=el.intValue();
}
if(s>n)
{
ev=false;
}
return ev;
}
Integer el = (Integer)stiva.elementAt(i);
s+=el.intValue();
}
if(as)
{
if(solutie()) tipar();
else initS();
}
else stiva.removeElementAt( stiva.size()-1 );
}
System.out.println("Sfarsit generare");
}
Fiind data o tabla de sah de dimensiune nxn si cunoscand pozitia unui cal , se cer toate posibilitatile
de a parcurge intreaga tabla , a.i calul sa nu treaca de doua ori prin acelasi loc. Solutiile gasite
pentru un anumit n trebuie salvate intr-un fisier pe disc.
import java.io.*;
class Calut{
//initializare
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
tabla[i][j]=LIBER;
//punct de plecare
tabla[1][1]=1;
if(incerc(2,1,1)==SUCCES) afisare();
else System.out.println("\nNu exista solutii !!!");
System.out.println("\n\nNumar de incercari = "+ni);
} // main
for(int i=1;i<=n;i++){
System.out.println();
for(int j=1;j<=n;j++)
System.out.print("\t"+tabla[i][j]);
}
}// afisare()
rezultatIncercare=ESEC;
while ((rezultatIncercare==ESEC)&&(k<=8))// miscari posibile cal
{
xu=x+a[k]; //actualizare pozitie pe Ox
yu=y+b[k]; //actualizare pozitie pe Oy
// verificare
if((xu>=1)&&(xu<=n)&&(yu>=1)&&(yu<=n))
if(tabla[xu][yu]==LIBER){
tabla[xu][yu]=i;
afisare();
if (i<np){
rezultatIncercare=incerc(i+1,xu,yu);
if(rezultatIncercare==ESEC) tabla[xu][yu]=LIBER;
}
else rezultatIncercare=SUCCES;
}
k++;
}// while
return rezultatIncercare;
}// incerc()
}// class
ASD
5. Probleme propuse
Un grup de n persoane sunt asezate pe un rand de scaune. Intre oricare doi vecini izbucnesc
conflicte. Rearanjati persoanele pe scaune astfel ıncat ıntre oricare doi vecini ”certati” sa existe una
sau cel mult doua persoane cu care nu au apucat sa se certe! Afisati toate variantele de reasezare
posibile.
Vom rezolva problema prin metada backtracking. Presupunem ca persoanele sunt numerotate la
ınceput, de la stanga la dreapta cu 1, 2, ..., n. Consideram ca solutie un vector x cu n componente
pentru care xi reprezinta ”pozitia pe care se va afla persoana i dupa reasezare”.
Se da numarul natural n>0. Sa se determine toate sirurile de n paranteze rotunde care se inchid
corect. De exemplu, pentru n=4 avem : (()) si ()() . Solutiile gasite pentru un anumit n trebuie
salvate intr-un fisier pe disc.
La curtea regelui Arthur sunt n cavaleri , fiecare avand dusmani. Pentru a pastra armonia la masa
rotunda , regele trebuie sa ii aseze la masa astfel incat doi dusmani sa nu fie vecini. Dusmanii sunt
specificati utilizand o matrice (elementul aij este 1 daca cavalerul i este dusmanit de cavalerul j , si
0 daca acestia sunt prieteni).
5.4 Tricolor
Avem la dispozitie 6 culori : alb , galben , rosu, verde , albastru , negru. Sa se gaseasca toate
drapelele tricolore ce se pot proiecta stiind ca cele trei culori de pe un drapel sunt distincte, iar
culoarea din mijloc trebuie sa fie pentru orice drapel galben sau verde.