rearanjat, și împărțit pe limbaje, redenumit

This commit is contained in:
2026-02-27 20:55:36 +02:00
parent 9d65b1e00c
commit 56ae1f8488
21 changed files with 661 additions and 26 deletions
+177
View File
@@ -0,0 +1,177 @@
#include <iostream>
#include <fstream>
#include <string>
struct nodInCoada {
int x, y;
};
struct coadaCirculara {
nodInCoada* coada;
int fata;
int spate;
int marime;
coadaCirculara(int m) {
marime = m;
coada = new nodInCoada[marime];
fata = -1;
spate = -1;
}
void adauga(int x, int y) {
if (fata == -1) {
fata = 0;
}
spate = (spate + 1) % marime;
coada[spate].x = x;
coada[spate].y = y;
}
nodInCoada scoate() {
nodInCoada value = coada[fata];
if (fata == spate) {
fata = -1;
spate = -1;
} else {
fata = (fata + 1) % marime;
}
return value;
}
bool eGol() {
return fata == -1;
}
};
void citesteLabirint(std::string numeLabirint,
int**& labirint, int& n, int& m) {
std::ifstream fisier(numeLabirint);
fisier >> n >> m;
labirint = new int*[n];
for (int i = 0; i < n; i++) {
labirint[i] = new int[m];
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
fisier >> labirint[i][j];
}
}
}
bool** creazaIstoric(int n, int m) {
bool** aFost = new bool*[n];
for (int i = 0; i < n; i++) {
aFost[i] = new bool[m];
for (int j = 0; j < m; j++) {
aFost[i][j] = false;
}
}
return aFost;
}
//scrie o matrice cu FALSE pentru a tine minte unde
//a mai fost soarecele
void stergeIstoric(bool** istoric, int n) {
for (int i = 0; i < n; i++) {
delete[] istoric[i];
}
delete[] istoric;
}
//dealoca memorie matrice bool
void stergeMatriceInt(int** matrice, int n) {
for (int i = 0; i < n; i++) {
delete[] matrice[i];
}
delete[] matrice;
}
//dealoca memorie matrice int
void laBFSirint(int** labirint, int xPlecare, int yPlecare,
int xBranza, int yBranza,
int n, int m) {
coadaCirculara q(n * m);
bool** trecut = creazaIstoric(n, m);
int** xAnterior = new int*[n];
int** yAnterior = new int*[n];
for (int i = 0; i < n; i++) {
xAnterior[i] = new int[m];
yAnterior[i] = new int[m];
for (int j = 0; j < m; j++) {
xAnterior[i][j] = -1;
yAnterior[i][j] = -1;
}
}
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
//direcții de mișcare sus, jos, stânga, dreapta în 2 vectori.
//Algoritm de cautare in latime.
q.adauga(xPlecare, yPlecare);
trecut[xPlecare][yPlecare] = true;
while (!q.eGol()) {
nodInCoada curent = q.scoate();
int x = curent.x;
int y = curent.y;
if (x == xBranza && y == yBranza) {
std::cout << "Soarecu a pus gheara pe branza!\n";
std::cout << "Inainte sa ajunga la branza el a fost prin: ";
int xCurent = xBranza, yCurent = yBranza;
while (xCurent != -1 && yCurent != -1) {
std::cout << "(" << xCurent << "," << yCurent << ") ";
int xParinte = xAnterior[xCurent][yCurent];
int yParinte = yAnterior[xCurent][yCurent];
xCurent = xParinte;
yCurent = yParinte;
}
std::cout << "\n";
return;
} //Soarecu se opreste cand da de branza
//Daca nu a gasit branza cauta in pozitiile vecine
for (int i = 0; i < 4; i++) {
int xVecin = x + dx[i];
int yVecin = y + dy[i];
if (xVecin >= 0 && xVecin < n && yVecin >= 0 && yVecin < m &&
!trecut[xVecin][yVecin] && labirint[xVecin][yVecin] != -1) {
q.adauga(xVecin, yVecin);
trecut[xVecin][yVecin] = true;
xAnterior[xVecin][yVecin] = x;
yAnterior[xVecin][yVecin] = y;
}
}
}
std::cout << "Branza este o minciuna! Soarecele este inchis :( \n";
//Goleste memorie!
stergeIstoric(trecut, n);
for (int i = 0; i < n; i++) {
delete[] xAnterior[i];
delete[] yAnterior[i];
}
delete[] xAnterior;
delete[] yAnterior;
delete[] q.coada;
}
int main() {
int** labirint;
int n, m;
std::string harta;
std::cout << "Selectați labirintul (scrie numele fisierului): ";
getline(std::cin, harta);
citesteLabirint(harta, labirint, n, m);
laBFSirint(labirint, 0, 0, n-1, m-1, n, m);
//am ales conltul diametral opus punctului de plecare,
//dar ambele pot fi arbitrare
stergeMatriceInt(labirint, n);
return 0;
}