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
2
Răspuns:
Explicație:
Păi inițial mt arată cam așa:
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:
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().
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);
}
for (int i = 0; i <= 100 + 1; ++i) {
for (int j = 0; j <= 100 + 1; ++j) {
mt[i][j] = 1;
}
}
Alte întrebări interesante
Fizică,
8 ani în urmă
Matematică,
8 ani în urmă
Limba română,
8 ani în urmă
Istorie,
9 ani în urmă
Limba română,
9 ani în urmă