Informatică, întrebare adresată de SnakeAndEnd, 8 ani în urmă

Buna ziua, am nevoie de idei, sau daca se poate chiar codul rezolvat ( c++ ). Va rog mult!

Anexe:

Răspunsuri la întrebare

Răspuns de andrei750238
6

► Cerinta :

Pe o foaie de hartie este desenata o plasa cu N coloane si M randuri. In interiorul plasei sunt desenate B figuri. Fiecare figura consta din una sua mai multe celule intregi. Figurile nu se suprapun, nu au laturi sau varfuri comune. De determinat celula cu suprafata maxima.

► Program C++ :

#include <iostream>

#include <fstream>

using namespace std;

int M, N;

bool mat[101][101];

int expandeaza(int x, int y) {

int s = 1;

//Marcheaza pozitia curenta ca inactiva

mat[x][y] = 0;

//Aduna suprafetele blocurilor adiactente active

if (x > 0 && mat[x - 1][y])

 s += expandeaza(x - 1, y);

if (y > 0 && mat[x][y - 1])

 s += expandeaza(x, y - 1);

if (x < (N - 1) && mat[x + 1][y])

 s += expandeaza(x + 1, y);

if (y < (M - 1) && mat[x][y + 1])

 s += expandeaza(x, y + 1);

//Returneaza suprafata gasita

return s;

}

int main() {

//Citire date

ifstream f("pr3_in.txt");

f >> N >> M;

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

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

  f >> mat[i][j];

f.close();

//Gaseste suprafata maxima

int smax = 0;

int imax =0, jmax = 0;

for (int i = 1; i <= M; i++) {

 for (int j = 1; j <= N; j++) {

  if (mat[i][j] == 1) {

   int scurent = expandeaza(i, j);

   if (scurent > smax) {

    smax = scurent;

    imax = i;

    jmax = j;

   }

  }

 }

}

//Afisare rezultat

ofstream g("pr3_out.txt");

g << smax << endl << imax << " " << jmax;

g.close();

}

► Nota :

Folosirea variabilelor globale nu este recomandata in practica dar e folosita aici pentru a simplifica codul.

Programul se foloseste de recursivitate pentru a determina suprafata unei figuri, expandand de fiecare data la celulele vecine care contin valoarea 1.


SnakeAndEnd: Iti multumesc atat de mult ! poti te rog sa mi recomanzi o carte care are astfel de tehnici de rezolvare?
SnakeAndEnd: tehnici complexe
andrei750238: Nu este o tehnica complexa de rezolvare, e o aplicatie a recursivitatii. Atunci cand trebuie sa gasesti diferite suprafete conexe intr-o matrice se poate folosi o astfel de abordare in care te extinzi recusiv la celulele de langa (desi in unele cazuri exista si solutii ceva mai eficiente)
andrei750238: Daca totusi vrei o carte serioasa de algoritmica iti recomand Introduction to Algorithms de Thomas H. Cormen. O gasesti in romana ca "Introducere in algoritmi", inclusiv ca PDF, pe diverse site-uri. Nu lasa matematica si demonstratiile riguroase sa te sperie (poti sari peste acestea), algoritmii sunt clar descrisi si destul de usor de inteles daca ai rabdarea necesara.
SnakeAndEnd: multumesc mult ! apreciez.
andrei750238: Cu plăcere !
Alte întrebări interesante