Cod sursa(job #1654745)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 17 martie 2016 14:05:08
Problema Castel Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <cstdio>
#include <algorithm>
#define x first
#define y second
#include <queue>
#define N 155
#include <vector>

using namespace std;
int X,Y,n,m,i,j,pas=0,k,cheie[N*N];
queue<int> q;
vector<int> v[N*N];
bool ajuns[N*N],atins[N*N];

bool V(int x)
{
   return (x>0 && x<=n*m);
}

inline void lee()
{
    q.push(k);ajuns[k]=1;
    while(!q.empty())
    {
       k=q.front();
       q.pop();

       int v1,v2,v3,v4,i;
       v1=k+1;
       v2=k-1;
       v3=k-m;
       v4=k+m;

       if(V(v1) && ajuns[cheie[v1]] && !ajuns[v1]) q.push(v1), ajuns[v1]=1;
       if(V(v2) && ajuns[cheie[v2]] && !ajuns[v2]) q.push(v2), ajuns[v2]=1;
       if(V(v3) && ajuns[cheie[v3]] && !ajuns[v3]) q.push(v3), ajuns[v3]=1;
       if(V(v4) && ajuns[cheie[v4]] && !ajuns[v4]) q.push(v4), ajuns[v4]=1;

       atins[v1]=atins[v2]=atins[v3]=atins[v4]=1;

       for(i=0;i<v[k].size();++i)
       if(atins[v[k][i]] && !ajuns[v[k][i]])
            q.push(v[k][i]), ajuns[v[k][i]]=1;
   }
}

int main()
{
    freopen("castel.in","r",stdin);
    freopen("castel.out","w",stdout);

    scanf("%d%d%d",&n,&m,&k);

    int nr=0;
    for(i=1;i<=n;++i)
    for(j=1;j<=m;++j)
    scanf("%d",&nr), v[nr].push_back(i*m-m+j), cheie[i*m-m+j]=nr;

    lee();

    int ans=0;
    for(i=1;i<=n;++i)
    for(j=1;j<=m;++j)
    if(ajuns[i*m+j-m]) ++ans;
    printf("%d\n",ans);
    return 0;
}