Cod sursa(job #2078418)

Utilizator alexilasiAlex Ilasi alexilasi Data 29 noiembrie 2017 15:50:48
Problema Castel Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <bits/stdc++.h>
#define mp make_pair
#define f first
#define s second

using namespace std;

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

int n,m,k,i,j;
int l,c,ans;
int a[160][160],prez[160][160],ch[22501];

int dx[]={0,0,1,-1},dy[]={1,-1,0,0};

queue < pair<int,int> >q[22501],qq;
pair <int,int> p;

void fil(int l,int c)
{
    for(int i=0;i<4;i++)
    {
        if(!prez[l+dx[i]][c+dy[i]]&&ch[a[l+dx[i]][c+dy[i]]])
        {
            prez[l+dx[i]][c+dy[i]]=1;
            ans++;
            int nr=(l+dx[i]-1)*m+c+dy[i];
            while(!q[nr].empty())
            {
                qq.push(q[nr].front());
                q[nr].pop();
            }
            ch[nr]=1;
            fil(l+dx[i],c+dy[i]);
        }
    }
}

int main()
{
    fin>>n>>m>>k;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            fin>>a[i][j];
            q[a[i][j]].push(mp(i,j));
        }
    }
    if(k%m==0)
        l=k/m;
    else l=k/m+1;

    if(k%m==0)
        c=m;
    else c=k%m;

    qq.push(mp(l,c));
    prez[l][c]=1;
    ans++;
    while(!qq.empty())
    {
        p=qq.front();
        qq.pop();

        if(prez[p.f][p.s]==0)
        {
            ans++;
            int nr=(p.f-1)*m+p.s;
            while(!q[nr].empty())
            {
                qq.push(q[nr].front());
                q[nr].pop();
            }
            prez[p.f][p.s]=1;
        }
        ch[m*(p.f-1)+p.s]=1;
        fil(p.f,p.s);
    }
    fout<<ans;
    return 0;
}