SCADENTA: 30 decembrie
DOMENIU: Backtracking
TIMP DE IMPLEMENTARE: O ora (ora pro nobis)
(reamintesc, din partea mea puteti trimite surse la care ati lucrat
si sapte ceasuri, dar e bine sa pastrati o copie a sursei asa cum
arata ea dupa timpul recomandat, ca sa va puteti da seama cum v-ati
comporta in timp de concurs)
Sa consideram o tabla de 5x5 patratele si 25 de piese patrate, fiecare
piesa putand avea una din formele:
+-------------+ +-------------+ +-------------+
| | | | | | | | |
| | | | \ | | / |
|------|------| |---- ----| |---- ----|
| | | | \ | | / |
| | | | | | | | |
+-------------+ +-------------+ +-------------+
(1) (2) (3)
Se observa ca piesa (1) are conectate marginile N-S si E-V, piesa 2
are conectate marginile N-E si S-V, iar piesa 3 are conectate
marginile N-V si S-E. Subliniem ca cele doua linii din piesa 1 NU se
intersecteaza, ci trec "una pe sub cealalta".
Se cere sa se aseze cele 25 de piese pe tabla in asa fel incat sa se
obtina un drum care:
(1) Sa treaca prin fiecare patrat EXACT o data;
(2) Sa nu se autointersecteze;
(3) Sa porneasca din coltul de NV al tablei (linia 1, coloana 1),
incepand de la exteriorul tablei (fie dinspre nord, fie dinspre
vest);
(4) Sa se termine in coltul de SE al tablei (linia 5, coloana 5) si sa
paraseasca tabla.
INTRAREA: De pe prima si singura linie a fisierului BLACK.IN se vor citi
numerele N1, N2 si N3, reprezentand numarul de piese din tipurile 1, 2
si 3. Se garanteaza ca suma lor este 25.
IESIREA: In fisierul BLACK.OUT se va tipari o matrice cu 5x5 numere
separate prin spatii, reprezentand tipul piesei plasate in fiecare
patratel. Daca exista mai multe solutii, se va tipari una la alegere.
Daca nu exista nici o solutie, fisierul BLACK.OUT va contine numai
mesajul "Imposibil".
EXEMPLE:
BLACK.IN BLACK.OUT
6 9 10 1 2 3 1 2
3 3 1 3 3
1 3 3 2 2
1 2 2 3 3
2 1 3 2 2
BLACK.IN BLACK.OUT
25 0 0 Imposibil
TIMP DE EXECUTIE: O secunda pe un Cyrix P200 / 96MB RAM / Windows 95
Bafta!
Observatii pentru cei mici:
A) Citirea datelor din fisier se poate face in felul urmator:
var F:Text;
N1, N2, N3:Integer;
...
Assign(F, 'black.in'); Reset(F);
Read(F, N1, N2, N3);
Close(F);
B) Scrierea unei matrice A in fisier se poate face in felul urmator:
var G:Text;
A:array[1..5, 1..5] of Integer;
i,j:Integer;
...
Assign(G, 'black.out'); Rewrite(G);
for i:=1 to 5 do
begin
for j:=1 to 4 do Write(F, A[i,j], ' ');
WriteLn(F, A[i,5]);
end;
Close(G);
|
|