Sunteți pe pagina 1din 3

Sarcina:

1.Fie labirintul din următoarea imagine: 2.Fie dat un tablou unidimensional de dimensiunea 10
neordonat și o valoare ce trebuie căutată. Implementați
algoritmul de căutare prin interpolare pentru a găsi
poziția acestei valori în vectorul deja sortat. Se va
implementa varianta matematică, aplicând formul, nu se
va scrie programul în limbajul de programare.

Vectorul inițial: 77, 82, 35, 16, 50, 26, 69, 36, 95, 17

Stabiliți drumul minim ce poate fi parcurs din punctul Valoare ce trebuie căutată: 17
A (verde) în punctul B (roșu). Implementați algoritmul
lui Lee pentru acest caz în limbajul de programare.

1.Algoritmul lui Lee:


#include <fstream>
using namespace std;
const int DMAX = 500;
ifstream fin("lee.in");
ofstream fout("lee.out");
// Vectorii de deplasare
const int addLin[] = { -1, 0, 1, 0 };
const int addCol[] = { 0, 1, 0, -1 };
struct Pos {
int lin, col;
};
Pos a, b;
int m, n;
int mat[DMAX][DMAX];
int in, sf;
Pos q[DMAX * DMAX];
int vf;
Pos st[DMAX * DMAX];
// Subprogramul de citire a datelor din fișier
void citeste() {
fin >> m >> n;
for (int i = 1; i <= m; i++)
for (int j = 1; j <= n; j++)
fin >> mat[i][j];
fin >> a.lin >> a.col;
fin >> b.lin >> b.col;
}
// Subprogramul de a înconjura obstacolele
void inconjoara() {
for (int i = 0; i <= m + 1; i++)
mat[i][0] = mat[i][n + 1] = -1;
for (int j = 1; j <= n; j++)
mat[0][j] = mat[m + 1][j] = -1;
}
void lee() {
q[0] = a; in = sf = 0;
mat[a.lin][a.col] = 1;
Pos pos;
while (in <= sf && !mat[b.lin][b.col]) {
pos = q[in++];
for (int k = 0; k < 4; k++) {
Pos ngh;
ngh.lin = pos.lin + addLin[k];
ngh.col = pos.col + addCol[k];
if (!mat[ngh.lin][ngh.col]) {
mat[ngh.lin][ngh.col] = mat[pos.lin][pos.col] + 1;
q[++sf] = ngh;
}
}
}
}
// Subprogramul de afișare a datelor în fișier
void afiseaza() {
Pos pos = st[++vf] = b;
while (mat[pos.lin][pos.col] > 1)
for (int k = 0; k < 4; k++) {
Pos ngh;
ngh.lin = pos.lin + addLin[k];
ngh.col = pos.col + addCol[k];
if (mat[ngh.lin][ngh.col] == mat[pos.lin][pos.col] - 1)
{
st[++vf] = pos = ngh; break;
}
}
fout << mat[b.lin][b.col] << '\n';
while (vf) {
fout << st[vf].lin << ' ' << st[vf].col << '\n';
vf--;
}
}
// Programul principal
int main() {
citeste();
inconjoara();
lee();
afiseaza();
fout.close();
return 0;
}

Fig.1 Datele de intrare

2. Vectorul inițial: 77, 82, 35, 16, 50, 26, 69, 36, 95, 17
Valoare ce trebuie căutată: 17
Vectorul sortat : 16, 17, 26, 35, 36, 50, 69, 77, 82, 95

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