Cod sursa(job #2270864)

Utilizator Mirela_MagdalenaCatrina Mirela Mirela_Magdalena Data 27 octombrie 2018 17:49:25
Problema Castel Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <cstdio>
#include <vector>
using namespace std;


int a[155][155], n, m, k;
vector <int> need_keys[22500];
int am[22500];
int di[] = {-1, 0, 1, 0}, dj[] = {0, 1, 0, -1};
int nrcam;


void prin_castel(int MaAflu)
{
    if(am[MaAflu])
    {
        return;
    }
    nrcam++;
    am[MaAflu] = 1;
    int i = (MaAflu-1)/m+1, j = (MaAflu-1)%m + 1;
    for(int v = 0; v<4; v++)
    {
        int iv = i + di[v];
        int jv = j + dj[v];
        if(am[a[iv][jv]] != 0 && a[iv][jv] != -1)
            prin_castel((iv-1)*m+jv);
    }
    for(int AmCheia = 0; AmCheia<need_keys[MaAflu].size(); AmCheia++)
    {
        int ii = (need_keys[MaAflu][AmCheia]-1)/m+1;
        int ji = (need_keys[MaAflu][AmCheia]-1)%m+1;
        for(int v = 0; v<4; v++)
        {
            int iv = ii+di[v];
            int jv = ji+dj[v];
            if(a[iv][jv]!=-1 && am[a[iv][jv]] != 0)
                prin_castel(need_keys[MaAflu][AmCheia]);
        }
    }
}




void bord()
{
    for(int i=0; i<=n+1; i++)
    {
        a[i][0] = -1;
        a[i][m+1] = -1;
    }
    for(int j=0; j<=m+1; j++)
    {
        a[0][j] = -1;
        a[n+1][j] = -1;
    }
}


int main()
{
    freopen("castel.in", "r", stdin);
    freopen("castel.out", "w", stdout);
    scanf("%d %d %d\n", &n, &m, &k);
    int c = 1;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
        {
            scanf("%d", &a[i][j]);
            need_keys[a[i][j]].push_back(c);
            c++;
        }
    bord();
    prin_castel(k);
    printf("%d", nrcam);
    return 0;
}