Sunteți pe pagina 1din 11

Proiect Informatica

Nume Problema :
Soarece
Sursa
:www.pbinfo.ro
Nume
elev:Constantin
Radu Petrisor

Petrisor

28 May 2014

Clasa: XI B

Table of
Contents
Enuntul Problemei:..............................................................2
Descrierea metodei de rezolvare a problemei:....................3
Toate variabilele globale sunt de tip intreg (int):...............3
Descrierea functiilor folosite............................................4
Descrierea algoritmului folosit.........................................4
Elemente de eficienta:.....................................................5
ALGORITMUL.......................................................................6
Seturi de date de intrare-iesire................................7

Enuntul Problemei:
Cerina
Se d o tabl dreptunghiular format din n linii i m coloane,
definind n*m zone, unele dintre ele fiind libere, altele coninnd obstacole.
n zona aflat la poziia is, js se afl un oarece care se poate deplasa pe
tabl trecnd din zona curent n zona nvecinat cu aceasta pe linie sau pe
coloan. Scopul sau este s ajung la o bucat de brnz aflat n zona de
la poziia ib, jb, fr a prsi tabla, fr a trece prin zone care conin
obstacole i fr a trece de dou ori prin aceeai zon.
Determinai cte modaliti prin care oarecele poate ajunge de la pozi ia
iniial la cea a bucii de brnz exist
Date de intrare
Fiierul de intrare soarece.in conine pe prima linie numerele n m,
separate printr-un spaiu. Urmtoarele n linii conin cte m valori 0 sau1,
separate prin exact un spaiu, care descriu tabla valoarea 0 reprezint o
zon liber, valoarea 1 reprezint o zon ocupat cu un obstacol. Pe
linia n+2 se afl 4 numere separate prin exact un spaiu, reprezentnd is
js ib jb.
Date de ieire
Fiierul de ieire soarece.out va conine pe prima linie numrul S,
reprezentnd numrul de modaliti prin care oarecele poate ajunge de la
poziia iniial la cea a bucii de brnz.
Restricii i precizri

1 n,m 10

1 is,ib n, 1 js,jb m

poziia oarecelui i cea a bucii de brnz nu sunt identice i sunt


libere

Descrierea metodei de rezolvare a problemei:


Tehnica Folosita
Tehnica folosita este backtracking recursiv in plan
Variabile globale folosite pentru modelarea problemei .
Toate variabilele globale sunt de tip intreg (int):
n,m reprezinta numarul de linii respective coloane ale
labirintului codificat prin matricea a

a[14][14] reprezinta matricea ce este folosita pentru a


codifica labirintul si elementele sale sunt formate din
numere intregi 0 si 1 ce reprezinta culoar respective zid
is,js sunt numere intregi astel incat 1 is n, 1 js
m si reprezinta pozitia initiala a soarecelui in
labirint.Initial valoarea elementului a[is][js]
este 0
ib,jb sunt numere intregi astel incat
1 ib n, 1 jb m si reprezinta coordonatele
bucatii de branza la care trebuie sa ajunga
soarecele
nr reprezinta numarul de modalitati prin care soarecele
poate ajunge de la pozitia initiala la pozitia bucatii de
branza,respectand conditiile cerute in enunt.Este de tip
intreg si valoarea sa este un numar natural.

Descrierea functiilor folosite


1. Functia citire este de tip void si este folosita pentru a citi
datele de intrare din fisierul soarece.in.De asemenea tot
in functia citire se realizeaza bordarea matricei a pe liniile 0
si n+1 respectiv coloanele 0 si m+1 cu valoarea -1 pentru a
nu permite iesirea din matrice a algoritmului folosit.Nu are
parametri nici variabile locale
2. Functia branzaebuna este de tip void si este folosita
pentru a determina numarul de drumuri posibile prin labirint
pana la bucata de branza,pornind de la pozitia initiala a
soricelului.Contine doi parametric de tip int care la primul
apel reprezinta pozitia initiala a soarecelui.Nu contine
variabile locale
3. Functia main este de tip int si reprezinta functia principala
a programului.In interiorul ei sunt apelate functiile citire,
branzaebuna si este afisat numarul de drumuri nr in
fisierul de iesiresoarece.out.Nu are variabile locale.
Descrierea algoritmului folosit.
Initial este realizata citirea datelor de intrare si bordarea
matricei prin care este codificat labirintul prin apelul functiei
realizate pentru aceasta, citire.
Urmatorul pas este apelul functiei branzaebuna cu parametrii
is,js ce reprezinta pozitia initiala a soarecelui.Principiul de
determinare a modalitatilor de a ajunge la branza este
urmatorul:
Se verifica daca elementul curent a[x][y] este un
culoar,adica are valoarea 0(a[x][y]==0).Daca nu este egal
cu zero se revine la apelul recursiv anterior sau se iese din
functie daca era primul apel.Daca este egal cu 0 se
marcheaza elementul cu valoarea 2 reprezentand faptul ca
a fost calcat in drumul respectiv si se verifica daca
pozitia curenta este aceeasi cu pozitia bucatii de

branza,adica daca is==ib si js==jb.In caz afirmativ se


incrementeaza variabila nr care are initial valoarea 0 si
reprezinta faptul ca sa gasit un drum.In caz negative(nu sa
ajuns la bucata de branza) se apeleaza recursiv functia
branza e buna pentru a realiza deplasarea soarecelui pe
cele 4 directii admise de problema.Parametrii realizati in
cele 4 apeluri vor corespunde pozitiilor laterale respective
superioara si inferioara fata de pozitia curenta si se reia
primul pas(se verifica daca elemental curent)
Dupa incheierea si iesirea din functie variabila globala nr
va avea o valoare ce reprezinta numarul de modalitati in
care soarecele poate ajunge la bucata de branza.
Elemente de eficienta:
o Timp de executie
n*m operatii de citire folosite pentru citirea
matricei(+6 operatii de citire pentru n,m,is,ib,js,jb dar
sunt mici comparative cu citirea matricei)
m+n operatii de atribuire
functie recursive ,folosind metoda backtracking ,cu
structura arborescenta
o operatie de afisare
Concluzie O(n*m+n+mstructura arborescenta)
o Memorie
nmax*mmax*sizeof(int)
CONCLUZIE: Eficienta programului este redusa,fiind
necesara efectuarea unui numar mare de operatii
pentru generarea solutiei,folosind metoda
backtracking in mod recursive.

ALGORITMUL
1. #include <iostream>
2. #include<fstream>
3. using namespace std;
4. ifstream fin("soarece.in");
5. ofstream fout("soarece.out");
6. int a[14][14],is,js,ib,jb,n,m,nr;
7. void citire()
8. {
9.

fin>>n>>m;

10.

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

11.

12.

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

13.

14.

fin>>a[i][j];

15.

16.

17.

fin>>is>>js>>ib>>jb;

18.

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

19.

20.

a[0][i]=-1;

21.

a[n+1][i]=-1;

22.

23.

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

24.

25.

a[i][0]=-1;

26.

a[i][m+1]=-1;

27.
28.

29. }
30. void branzaebuna(int x,int y)
31. {if(a[x][y]==0)
32.

33.

a[x][y]=2;

34.

if(x==ib && y==jb)

35.
36.

nr++;

else

37.

{branzaebuna(x-1,y);

38.

branzaebuna(x,y+1);

39.

branzaebuna(x+1,y);

40.

branzaebuna(x,y-1);

41.

42.

a[x][y]=0;

43.

44. }
45. int main()
46. {
47. }

citire();

branzaebuna(is,js); fout<<nr;

return 0;

Seturi de date de intrare-iesire


Set 1
Date de intrare :
6 7
0 0 0 0
0 1 1 1
0 0 0 0
0 1 1 0
0 1 1 0
0 0 0 0
4 1 2 6
Date de
8
Set 2
Date de
6 7
0 0 0 0
0 1 1 1
0 0 0 1
0 1 1 0
0 1 1 0
0 0 1 0
4 1 2 6
Date de
0
Setul
Date de
5 5
0 0 0 0
0 1 0 1
0 0 0 1
0 1 1 0
0 0 0 0
3 3 1 5
Date de
4

0
1
1
1
1
0

0
0
1
0
0
0

0
0
0
0
1
0

iesire :
intrare
0
1
1
1
1
0

1
0
1
0
0
0

0
0
0
0
1
0

iesire :
3
intrare:
0
0
0
0
1
iesire:

Bibliografie:
1.www.pbinfo.ro
2.Metode de programare,Grafuri si POO,editura Else(culegere clasa)

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