Sunteți pe pagina 1din 5

MINISTERUL EDUCAȚIEI, CULTURII ȘI CERCETĂRII AL REPUBLICII MOLDOVA

IP CENTRUL DE EXCELENȚĂ ÎN INFORMATICĂ ȘI TEHNOLOGII INFORMAȚIONALE

DISCIPLINA

UTILIZAREA TEHNICILOR CLASICE DE PROGRAMARE

Test de autoevaluare 1
RECAPITUlARE GENERALĂ LA MODULELE 1 ȘI 2.

Specialitatea: Programare și analiza produselor program

Elev: Jimbei Adelina, grupa P-1833

Profesor: Dascal Andrian

Chișinău, 2020
Sarcini rezolvate
1) Fie labirintul din următoarea imagine:

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

Rezolvare:

#include <bits/stdc++.h>
using namespace std;
const int DMAX = 500;
ifstream fin("labirint_ev.in");
ofstream fout("labirint_ev.out");
// Vectorii de deplasare
const int addLin[] = {-1, 0, 1, 0};
const int addCol[] = {0, 1, 0, -1};
struct Pos {
int lin, col;
};
int m, n, mat[DMAX][DMAX];
Pos a, b;
queue<Pos> q;
// 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.push(a);
mat[a.lin][a.col] = 1;
while (!q.empty() && !mat[b.lin][b.col]) {
Pos pos = q.front();
q.pop();
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.push(ngh);
}
}
}
}
// Subprogramul de afișare a datelor în fișier
void afiseaza(Pos pos) {
if (pos.lin == a.lin && pos.col == a.col) {
fout << a.lin << ' ' << a.col << '\n';
return;
}
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) {
afiseaza(ngh);
fout << pos.lin << ' ' << pos.col << '\n';
return;
}
}
}
// Programul principal
int main() {
citeste(); inconjoara(); lee();
fout << mat[b.lin][b.col] << '\n'; afiseaza(b);
fout.close(); return 0;
}

Rezultate obținute în urma execuției programului:


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
Valoarea ce trebuie căutată: 17

Rezolvare:

1. Vectorul sortat în ordine crescătoare: 16, 17, 26, 35, 36, 50, 69, 77, 82, 95
2. Substituim în formulă datele noastre:

(17 − 16) ∗ (9 − 0)
𝑝𝑜𝑧 = 0 + = 0,11..
95 − 16

(17 − 17) ∗ (9 − 1)
𝑝𝑜𝑧 = 1 + =𝟏
95 − 17

R/s: Nr. 17 se află pe poziția 1

3) Să se aranjeze pe o tabla de dimensiunea NxN, cele N ture astfel încât ele să nu se bată una
pe alta. Să se implementeze algoritmul Branch and Bound pentru a găsi soluția acestei
probleme.

Rezolvare:

#include <iostream>
#include <cmath>
using namespace std;
int n,v[100],sol;
void afisare()
{ int i,j,x;
sol++;
cout<<endl;
cout<<"Varianta "<<sol<<" de aranjare a turelor"<<endl;
for(i=1;i<=n;i++)
{ for(j=1;j<=n;j++)
if(v[i]==j)
cout<<" T ";
else cout<<" _ ";
cout<<endl;}}
int valid(int k){
int i;
for(i=1;i<=k-1;i++)
if((v[i]==v[k])||(abs(v[k]-v[i])==(k-i)))
return 0;
return 1;}

int solutie(int k)
{ if(k==n)
return 1;
return 0;}
void bk(int k)
{ int i;
for(i=1;i<=n;i++)
{ v[k]=i;

if(valid(k)==1)
{
if(solutie(k)==1)
afisare();
else
bk(k+1); }}}

int main(){
cout<<"Dati dimeniunea tablei: ";cin>>n;
bk(1);
return 0;}

Rezultate obținute în urma execuției programului:

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