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

PLS!!! URGENT!!!

Buna! Imi poate cineva experimentat si care stie informatica de ce nu merge codul urmator? Problema este de pe pbinfo ( #837) doar ca putin schimbata. In loc sa fie 1 insulele eu vreau ca 0 sa fie insulele. Am incerat sa fac prim mai multe metode dar nu a mers. Accesez pozitii invalide din memorie si chiar nu inteleg de ce.

#include
using namespace std;

int n, m, counter = 0, mt[100 + 2][100 + 2];

void fill (int i, int j) {
if (mt[i][j] == 1) {
return;
}
mt[i][j] = 1;
if (mt[i + 1][j] == 0) {
fill(i + 1, j);
}
if (mt[i - 1][j] == 0) {
fill(i - 1, j);
}
if (mt[i][j - 1] == 0) {
fill (i, j - 1);
}
if (mt[i][j + 1] == 0) {
fill (i, j + 1);
}
}

int main() {
int n, m, counter = 0;
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
cin >> mt[i][j];
}
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
if (mt[i][j] == 0) {
++counter;
fill(i, j);
}
}
}
cout << counter;
return 0;
}

Răspunsuri la întrebare

Răspuns de VxF
2

Răspuns:

Explicație:

Păi inițial mt arată cam așa:

\begin{array}{ccccccccccc}&amp;0.&amp;1.&amp;2.&amp;3.&amp;4.&amp;5.&amp;6.&amp;7.&amp;8.&amp;9.\\0.&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\1.&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\2.&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\3.&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\4.&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\5.&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\6.&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\7.&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\8.&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\9.&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\end{array}

După citirea exemplului folosit pe pbinfo:

5 6

1 1 0 0 1 1

0 1 0 1 1 0

0 1 1 0 0 1

0 0 0 0 0 0

1 1 1 1 1 1

Devine:

\begin{array}{ccccccccccc}&amp;0.&amp;1.&amp;2.&amp;3.&amp;4.&amp;5.&amp;6.&amp;7.&amp;8.&amp;9.\\0.&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\1.&amp;0&amp;1&amp;1&amp;0&amp;0&amp;1&amp;1&amp;0&amp;0&amp;0\\2.&amp;0&amp;0&amp;1&amp;0&amp;1&amp;1&amp;0&amp;0&amp;0&amp;0\\3.&amp;0&amp;0&amp;1&amp;1&amp;0&amp;0&amp;1&amp;0&amp;0&amp;0\\4.&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\5.&amp;0&amp;1&amp;1&amp;1&amp;1&amp;1&amp;1&amp;0&amp;0&amp;0\\6.&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\7.&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\8.&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\9.&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\end{array}

Vezi? Datele sunt încărcate de la mt[1][1], nu de la mt[0][0], iar matricea e mai mare decât datele posibile. Deci jur-împrejur rămâne un chenar de 0-uri.

Programul se folosește de acel chenar pentru oprire. Că la fill() nu verifică niciunde dacă ce avansările de + 1 / - 1 se depășește matricea, pentru că se bazează pe chenarul de 0-uri.

Deci dacă tu inversezi _toată_ logica 1 și 0, atunci trebuie să asiguri și un chenar de 1-uri.

Dar mai bine implementează testele de depășire.


VxF: Dacă implementezi testele sugerate și o să ai probleme la compararea cu n și m, atunci să știi că singur ți l-ai făcut când ai declarat variabile n și m atât globale cât și locale lui main().
GAGA135: Mda, asta era o greseala de la mine. Nu trebuiau sa mai fie declarate local. Dar trebuie facut mai exact sa imi iasa problema?
GAGA135: Am setat matricea la 1 dar tot nu merge.
VxF: Eu am preferat să pun testele și mi-a dat rezultatul corect, 3:
if (i + 1 <= n && mt[i + 1][j] == 0) {
fill(i + 1, j);
}
if (i - 1 >= 1 && mt[i - 1][j] == 0) {
fill(i - 1, j);
}
if (j - 1 >= 1 && mt[i][j - 1] == 0) {
fill (i, j - 1);
}
if (j + 1 <= m && mt[i][j + 1] == 0) {
fill (i, j + 1);
}
VxF: Acum am încercat ci varianta cu inițializat matricea cu 1 și și așa am primit rezultatul corect, 3. Doar am băgat asta înainte de a citi datele hărții:
for (int i = 0; i <= 100 + 1; ++i) {
for (int j = 0; j <= 100 + 1; ++j) {
mt[i][j] = 1;
}
}
GAGA135: Ms mult de tot!
Alte întrebări interesante