Sunteți pe pagina 1din 9

Proiect Informatica

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

Petrisor
5/28/2014 Clasa: XI B
28 May 2014
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:
Cerinţa

Se dă o tablă dreptunghiulară formată din n linii și m coloane,


definind n*m zone, unele dintre ele fiind libere, altele conținând obstacole.
În zona aflată la poziția is, js se află un șoarece care se poate deplasa pe
tablă trecând din zona curentă în zona învecinată cu aceasta pe linie sau pe
coloană. Scopul sau este să ajungă la o bucată de brânză aflată în zona de
la poziția ib, jb, fără a părăsi tabla, fără a trece prin zone care conțin
obstacole și fără a trece de două ori prin aceeași zonă.

Determinați câte modalități prin care șoarecele poate ajunge de la poziția


inițială la cea a bucății de brânză există

Date de intrare

Fişierul de intrare soarece.in conţine pe prima linie numerele n m,


separate printr-un spațiu. Următoarele n linii conțin câte m valori 0 sau1,
separate prin exact un spațiu, 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 spațiu, reprezentând is
js ib jb.

Date de ieşire

Fişierul de ieşire soarece.out va conţine pe prima linie numărul S,


reprezentând numărul de modalități prin care șoarecele poate ajunge de la
poziția inițială la cea a bucății de brânză.

Restricţii şi precizări

 1 ≤ n,m ≤ 10
 1 ≤ is,ib ≤ n, 1 ≤ js,jb ≤ m

 poziția șoarecelui și cea a bucății de brânză 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 iesire”soarece.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. nr++;
36. 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. { citire(); branzaebuna(is,js); fout<<nr; return 0;
47. }
Seturi de date de intrare-iesire
Set 1

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

1.www.pbinfo.ro

2.Metode de programare,Grafuri si POO,editura Else(culegere clasa)

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