Sunteți pe pagina 1din 2

8.

Colorarea unei hri


Desenul alturat reprezint o hart cu 5 ri
numerotate de la 1 la 5. Se genereaz toate variantele
de colorare a acestei hri avnd la dispoziie 4
culori notate cu A, B, C, D, astfel nct oricare dou
ri vecine s nu fie colorate la fel.
Prima soluie este (A, B, C, A, B) avnd
urmtoarea semnificaie: ara 1 e colorat cu A,
ara 2 e colorat cu B, ara 3 e colorat cu C,
ara 4 e colorat cu A, ara 5 e colorat cu B.
Scriei un program care pentru o hart dat s genereze toate variantele de colorare cu 4
culori a hrii, astfel nct oricare dou ri vecine s nu fie colorate la fel.
Harta va fi reprezentat sub forma unei matrice a vecinilor, cu urmtoarea semnificaie:
[
1
1 0
2 1
3 1
4 0
5 0

2
1
0
1
1
0

]
3
1
1
0
1
0

{
4
0
1
1
0
1

5
0
0
0
1
0

Vecinii sunt:
ara 1: 2, 3
ara 4: 2, 3, 5

ara 2: 1, 3, 4
ara 5: 4

ara 3: 1,2,4

Observaii:
1. Pentru n ri, matricea este ptratic, are n linii i n coloane
2. Pe diagonala principal elementele sunt nule, A[i, i] = 0 * ara ti nu se nvecineaz cu ea nsi
3. Matricea este simetric, adic A[i,j] = A[j, i] * dac ara ti se invecineaz cu ara tj atunci i tj se
nvecineaz cu ti.

Teorema colorrii hrilor: Orice hart plan poate colorat folosind cel mult 4 culori
Reprezentarea soluiei: - soluia are n componente, unde n este numrul de ri
-fiecare component xk are valori n mulimea {A, B, C, D}
Condiia de validare: - soluia nu are continuare dac dou ri vecine sunt colorate la fel
Prima soluie: A, B, C, A, B

Varianta recursiv
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.

#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