Cod sursa(job #1086192)

Utilizator sebinechitasebi nechita sebinechita Data 17 ianuarie 2014 20:34:18
Problema Castel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream fin("castel.in");
ofstream fout("castel.out");
#define MAX 156

int a[MAX][MAX];
int di[]={0,0,1,-1};
int dj[]={1,-1,0,0};

bool viz[MAX][MAX], aproape[MAX][MAX], accesibil[MAX][MAX];

vector <int> keys[MAX*MAX];
queue <int> coada;

int n, m, k;

void open(int key)
{
    for(int i=0;i<keys[key].size();i++)
    {

        int xi=keys[key][i]/m, xj=keys[key][i]%m;
        accesibil[xi][xj]=1;
        if(aproape[xi][xj] && !viz[xi][xj])
        {
            coada.push(xi*m+xj);
        }
    }
}

int main()
{
    int i, j, r, x, y, x1, y1;
    fin>>n>>m>>k;
    k--;
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            fin>>a[i][j];
            a[i][j]--;
            keys[a[i][j]].push_back(i*m+j);
        }
    }
    coada.push(k);
    accesibil[k/m][k%m]=1;
    int s=0;
    while(coada.size())
    {
        r=coada.front();
        coada.pop();
        x=r/m;
        y=r%m;
        viz[x][y]=1;
        open(r);

        for(int e=0;e<4;e++)
        {
            x1=x+di[e];
            y1=y+dj[e];
            if(x1<0 || x1>n || y1<0 || y1>m)
                continue;

            aproape[x1][y1]=1;
            if(accesibil[x1][y1] && !viz[x1][y1])
                coada.push(x1*m+y1);
        }
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            if(aproape[i][j] && accesibil[i][j])
                s++;
        }
    }
    fout<<s<<" ";
}