Cod sursa(job #2567913)

Utilizator SergiuS3003Sergiu Stancu Nicolae SergiuS3003 Data 3 martie 2020 19:41:48
Problema Castel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("castel.in");
ofstream g("castel.out");
const int DMAX = 150;
struct pozitie
{
    short x, y;
    pozitie(int x = 0, int y = 0)
    {
        this->x = x;
        this->y = y;
    }
};
int M, N, K, nrCamere;
int H[DMAX + 2][DMAX + 2];
bool Key[DMAX * DMAX + 1];
bool viz[DMAX + 1][DMAX + 1];
pozitie Q[DMAX * DMAX + 1];
pozitie d[4] = {{0, -1}, {-1, 0}, {1, 0}, {0, 1}};
void citire()
{
    f >> M >> N >> K;
    for(int i = 1; i <= M; i++)
        for(int j = 1; j <= N; j++)
            f >> H[i][j];
}
pozitie pozCam(int nrCamera)
{
    int xs = nrCamera / N;
    if(nrCamera % N != 0)
        xs++;
    int ys = nrCamera - (xs - 1) * N;
    return pozitie(xs, ys);
}
inline int nrCam(pozitie poz)
{
    return (poz.x - 1) * N + poz.y;
}
void Lee()
{
    pozitie crt, vec;
    bool camNoua;
    int u = 1;
    Key[K] = 1;
    Q[1] = pozCam(K);
    do
    {
        camNoua = 0;
        for(int i = 1; i <= u; i++)
        {
            crt = Q[i];
            for(int j = 0; j < 4; j++)
            {
                vec = pozitie(crt.x + d[j].x, crt.y + d[j].y);
                if(H[vec.x][vec.y] != 0 && Key[H[vec.x][vec.y]] == 1)
                    if(viz[vec.x][vec.y] == 0)
                    {
                        Key[nrCam(vec)] = 1;
                        viz[vec.x][vec.y] = 1;
                        Q[++u] = vec;
                        camNoua = 1;
                        nrCamere++;
                    }
            }
        }
    }
    while(camNoua == 1);
}
int main()
{
    citire();
    Lee();
    g << nrCamere;
    return 0;
}