Cod sursa(job #1678029)

Utilizator AndreiFlorescuAndrei Florescu AndreiFlorescu Data 6 aprilie 2016 22:39:01
Problema Castel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <iostream>
#include <fstream>

using namespace std;

#define NR_DIR 4

struct cell {
    int l;
    int c;
};

cell coada[23500];
int dl[4] = {0, -1, 0, 1};
int dc[4] = {-1, 0, 1, 0};
bool chei[23500], drum[152][152];
int castel[152][152];
int cntr, sol, n, m;

void lee () {
    //cout << "test";
    int i, j, lvec, cvec;
    bool iesi = false;
    for (i = 0; i < cntr; i++) {
        for (j = 0; j < NR_DIR; j++) {
            lvec = coada[i].l + dl[j];
            cvec = coada[i].c + dc[j];
            if (castel[lvec][cvec] != -1 && chei[castel[lvec][cvec]] && drum[lvec][cvec] == 0) {
                drum[lvec][cvec] = 1;
                coada[cntr].l = lvec;
                coada[cntr++].c = cvec;
                sol++;
                chei[(lvec - 1) * m + cvec] = 1;
                iesi = true;
            }
        }
    }
    if (iesi == true) {
        lee();
    }
}

int main() {
    ifstream file_in ("castel.in");
    ofstream file_out ("castel.out");

    int pozS;
    int i, j;

    // Citirea datelor
    file_in >> n >> m >> pozS;
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= m; j++) {
            file_in >> castel[i][j];
        }
    }

    // Bordare
    for (i = 0; i <= n + 1; i++) {
        castel[i][0] = castel[i][m + 1] = -1;
    }
    for (i = 0; i <= m + 1; i++) {
        castel[0][i] = castel[n + 1][i] = -1;
    }

    // Calcularea solutiei
    coada[cntr].l = ((pozS - 1) / m) + 1;
    coada[cntr].c = (pozS - 1) % m + 1;
    chei[castel[coada[cntr].l][coada[cntr].c]] = 1;
    cntr++;
    lee ();

    // Afisarea solutei
    file_out << sol;

    return 0;
}