Sunteți pe pagina 1din 3

Problema colorării hărţilor

Sunt probleme care se rezolvă cu metoda backtracking şi în care se cere o singură soluţie.
Implementarea presupune utilizarea unei variabile de semnalizare (de exemplu, variabila gata) care să
fie iniţial 0, la obţinerea soluţiei dorite aceasta primind valoarea 1. Orice succesor va fi condiţionat în plus
de valoarea variabilei gata.

Problema colorării hărţilor. Fiind dată o hartă cu n ţări, se cere o soluţie de colorare a hărţii,
utilizând cel mult 4 culori, astfel încât două ţări cu frontieră comună să fie colorate diferit.
Este demonstrat faptul că sunt suficiente numai 4 culori pentru ca orice hartă să poată fi colorată.
Pentru exemplificare, vom considera harta din figura 1, unde ţările sunt numerotate cu cifre cuprinse între
1 şi 5.

O soluţie a acestei probleme este următoarea:

• ţara 1 - culoarea 1;
• ţara 2 - culoarea 2;
• ţara 3 - culoarea 1;
• ţara 4 - culoarea 3;
• ţara 5 - culoarea 4.

Figura 1.

Harta este furnizată programului cu ajutorul unei matrice (tablou) A(n , n)

01010
10111
01001
11001
01110

Matricea A este simetrică. Pentru rezolvarea problemei se utilizează vectorul x, unde x[k] reţine culoarea
ataşată ţării k. Evident, orice soluţie are exact n componente.

// problema colorarii hartilor - program backtracking recursiv

// cu conditie de validare "valid"

#include <bits/stdc++.h>

using namespace std;


int x[20], a[20][20], n, m, k, j, nr;

void afisare()

cout << "Solutia : " << ++ nr << "\n";

for(int i = 1; i <= n; i ++)

cout << "tara " << i << " are culoarea " << x[i] << "\n";

cout << "\n";

bool valid(int k)

for(int i = 1; i < k; i ++)

if(x[k] == x[i] && a[k][i] == 1) return false;

return true;

void back(int k)

for(int i = 1; i <= m; i ++)

x[k] = i;

if(valid(k))

if(k == n) afisare();

else back(k + 1);

int main()
{

int i, j;

cout << "Numarul de tari n= "; cin >> n;

cout << "Numarul de culori m= "; cin >> m;

for(i = 1; i <= n - 1; i ++)

for(j = i + 1; j <= n; j ++)

cout << "Tara " << i << " este vecina cu tara " << j << " ?
[1/0] ";

cin >> a[i][j];

a[j][i] = a[i][j];

back(1);

if(!nr) cout << "Nu sunt solutii" << "\n";

else cout << "Avem " << nr << " solutii" << "\n";

return 0;