Cod sursa(job #1354069)

Utilizator zombacDica Razvan zombac Data 21 februarie 2015 16:55:50
Problema Castel Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream>
#include <cstring>
#include <queue>
#define x first
#define y second
using namespace std;
ifstream fin ("castel.in");
ofstream fout ("castel.out");
const int dl[] = { -1, 0, 1, 0 };
const int dc[] = { 0, 1, 0, -1 };
int N, M, K, X, Y, sol, V[160][160];
bool B[22510], fr[160][160], OP[160][160];
queue < pair < int, int > > Q;

void Fiil(int i, int j)
{
    K = (i - 1) * M + j;
    B[K] = 1;
    fr[i][j] = 1;

    for (int k = 0; k < 4; k++)
    {
        int ii = i + dl[k];
        int jj = j + dc[k];

        if (!fr[ii][jj] && B[V[ii][jj]])
        {
            Fiil(ii, jj);
        }
    }
}

int main()
{
    fin >> N >> M >> K;
    for (int i = 1; i <= N; i++)
    {
        for (int j = 1; j <= M; j++)
        {
            fin >> V[i][j];
        }
    }
    X = (K - 1) / M + 1;
    Y = K % M;
    if (!Y) Y = M;

    B[K] = 1;
    Fiil(X, Y);
    Q.push(make_pair(X, Y));
    while (!Q.empty())
    {
        int i = Q.front().x;
        int j = Q.front().y;
        Q.pop();
        OP[i][j] = 1;
        memset(fr, 0, sizeof(fr));
        Fiil(i, j);

        for (int k = 0; k < 4; k++)
        {
            int ii = i + dl[k];
            int jj = j + dc[k];
            if (!OP[ii][jj] && B[V[ii][jj]])
            {
                Q.push(make_pair(ii, jj));
            }
        }
    }

    for (int i = 1; i <= 22500; i++)
    {
        if (B[i]) sol++;
    }

    fout << sol << '\n';
    fout.close();
    return 0;
}