Mislim da je ipak najlakše da ti prosledim kod koji prolazi sve test primere, sa sve komentarima pa da vidiš kako bi se zadatak uradio. Evo koda:
// -- hide --
#include
#include
using namespace std;
// -- show --
// matrica i njene dimenzije
int bv, bk;
vector<vector> A;
// pomeraji koji odredjuju 4 susedna polja
int dv = {1, -1, 0, 0};
int dk = {0, 0, 1, -1};
const int MINA = 0;
const int NEBEZBEDNO = -1;
const int POSECENO = -2;
// provera da li se polje (v, k) nalazi unutar matrice
bool uMatrici(int v, int k) {
return 0 <= v && v < bv &&
0 <= k && k < bk;
}
// u matrici se obelezavaju sva nebezbedna polja (ona ciji su susedi mine)
void oznaciNebezbednaPolja() {
for (int v = 0; v < bv; v++)
for (int k = 0; k < bk; k++)
if (A[v][k] == MINA)
for (int i = 0; i < 4; i++) {
int vv = v + dv[i], kk = k + dk[i];
if (uMatrici(vv, kk) && A[vv][kk] != MINA)
A[vv][kk] = NEBEZBEDNO;
}
}
// put sa najvecim zbirom od polja (v, k) do donjeg reda matrice
int maksPut(int v, int k) {
int maks = -1;
if (v == bv-1)
maks = A[v][k];
int tmp = A[v][k];
A[v][k] = POSECENO;
for (int i = 0; i < 4; i++) {
int vv = v + dv[i], kk = k + dk[i];
if (uMatrici(vv, kk) && A[vv][kk] != POSECENO && A[vv][kk] != NEBEZBEDNO) {
int put = maksPut(vv, kk);
if (put != -1)
maks = max(maks, put + tmp);
}
}
A[v][k] = tmp;
return maks;
}
int maksBezbedniPut() {
// oznacavamo nebezbedna polja
oznaciNebezbednaPolja();
// najveci zbir koji se moze prikupiti
int maks = -1;
// posebno pokrecemo pretragu iz svakog polja u prvom redu matrice
for (int k = 0; k < bk; k++) {
if (A[0][k] != MINA && A[0][k] != NEBEZBEDNO) {
int put = maksPut(0, k);
if (put != -1)
maks = max(maks, put);
}
}
return maks;
}
// -- hide --
// ucitavanje matrice sa standardnog ulaza
void citajMatricu() {
cin >> bv >> bk;
A.resize(bv, vector(bk));
for (int v = 0; v < bv; v++)
for (int k = 0; k < bk; k++)
cin >> A[v][k];
}
int main() {
citajMatricu();
// ispisujemo najpovoljniji put
cout << maksBezbedniPut() << endl;
return 0;
}