Sunteți pe pagina 1din 6

Problema colorrii hrilor

Copae Stefan Daniel


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;}

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