ET 12 Fiind dat o hart cu n ri, se cer toate soluiile de colorare a hrii, utiliznd cel mult patru culori, astfel nct dou ri de frontier comun s fie colorate diferit. Este demonstrat faptul c sunt suficiente numai patru culori pentru ca orice hart s poat fi colorat Algoritm Pas1. Se introduc datele de intrare ( nr. de ri si matricea vecinilor) Pas2. Se initializeaz nivelul k al stivei Pas3. Ct timp exist nivele n stiv executm paii urmtori. Pas4. Cutm un succesor pe nivelul k al stivei pn cnd gasim unul care nu depete numrul maxim de culori, apoi verificm dac este valid (ndeplinete condiiile ca elementul gasit n stiv s fie diferit de celelalte elemente i n plus ara i s nu fie vecin cu ara k). Pas5. Dac s-a gsit un astfel de element i dac este o soluie a problemei se tiprete, iar n caz contrar se trece la nivelul urmtor al stivei i se initializeaz stiva. Pas6. n cazul n care nu s-a gsit nici o soluie pe nivelul k, coborm la nivelul anterior s cutm i alte soluii valide. Implementare Harta este furnizat programului cu ajutorul unei matrice Anxn A(i,j) = 1, dac ara i se nvecineaz cu ara j i valoarea 0 n caz contrar. Matricea A este simetric. Pentru rezolvarea problemei se utilizeaz stiva st, unde nivelul k al stivei simbolizeaz ara k, iar st[k] culoarea ataat rii k. Stiva are nlimea n (numrul de ri) i pe fiecare nivel ia valori ntre 1 i 4.
Program C++ #include<iostream> #include<fstream> using namespace std; int A[21][21]; char x[21]; int n,nr; ifstream fin("harta.in"); void citire() {int i,j; fin>>n; for(i=1;i<=n;i++) for(j=1;j<=n;j++) fin>>A[i][j];} void tipar() {int i; nr++; for(i=1;i<=n;i++) cout<<x[i]; cout<<'\n'; } int valid(int k) {int i; for(i=1;i<k;i++) if((A[i][k]==1)&&(x[i]==x[k])) return 0; return 1;} void back(int k) {char c; if(k==n+1) tipar(); else for(c='A';c<='D';c++) { x[k]=c; if(valid(k)) back(k+1); } } int main() {citire(); back(1); cout<<nr<<" solutii"; fin.close(); return 0;}