Cod sursa(job #1634571)

Utilizator caprariuapCaprariu Alin-Paul caprariuap Data 6 martie 2016 14:09:19
Problema Castel Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>

using namespace std;

ifstream fin("castel.in");
ofstream fout("castel.out");

short n,m,i,j,k;
short a[155][155];
short vizitate[155][155],nrcamere;
bool liber[155][155];

short dx[]= {0,-1,0,1};
short dy[]= {-1,0,1,0};
short chei[22500],nrchei;

int interior(int x,int y)
{
    if (x>=1&&x<=n&&y>=1&&y<=m)
        return 1;
    return 0;
}

void bkt(int x,int y,int cheie)
{
    liber[x][y]=1;
    if (vizitate[x][y]==0) vizitate[x][y]=1,nrcamere++;
    short z;
    int k=(x-1)*m+y;
    int ok=1;
    for (z=1; z<=nrchei; z++) if (chei[z]==k) ok=0;
    if (ok) chei[++nrchei]=k;
    for (k=0; k<4; k++)
        if (interior(x+dx[k],y+dy[k])&&liber[x+dx[k]][y+dy[k]]==0)
            if (a[x+dx[k]][y+dy[k]]==cheie||vizitate[x+dx[k]][y+dy[k]]) bkt(x+dx[k],y+dy[k],cheie);
    liber[x][y]=0;
}

int main()
{
    fin>>n>>m>>k;
    for (i=1; i<=n; i++)
        for (j=1; j<=m; j++)
            fin>>a[i][j];
    int xi=(k-k%m)/m+1;
    int yi=k%m;
    chei[++nrchei]=a[xi][yi];
    int terminat=0;
    int nr=0;
    while (!terminat)
    {
        short aux=nrcamere;
        for (i=1; i<=nrchei; i++)
            bkt(xi,yi,chei[i]);
        if (aux==nrcamere) terminat=1;
    }
    fout<<nrcamere<<'\n';
}