Cod sursa(job #1968487)

Utilizator AlexTheDagonBogdan Tudor AlexTheDagon Data 17 aprilie 2017 18:39:41
Problema Castel Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <iostream>
#include <deque>
#include <fstream>
#define x first
#define y second
#define mp make_pair
#define pb push_back
#define pf push_front
#define pp pop_front
using namespace std;
ifstream in("castel.in");
ofstream out("castel.out");
int dx[]={-1,0,1,0},dy[]={0,-1,0,1};
int cam,n,m,viz[155][155],c[300000],a[155][155],ii,jj,cm[155][155],sem,st;
deque <pair<int,int> > dq;
pair<int,int> fr,init;
int ok(int i,int j)
{
    return(i>0 && i<=n && j>0 && j<=m);
}
int main()
{
    in>>n>>m>>st;
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)in>>a[i][j];
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
        {
            cm[i][j]=++cam;
            if(st==cam)
            {
                dq.pf(mp(i,j));
                viz[i][j]=1;
                c[cam]=1;
            }
        }
    ///bine
    cam=0;
    while(!dq.empty() && sem!=2)
    {
        fr=dq.front();
        dq.pp();
        if(c[a[fr.x][fr.y]])
        {
            c[cm[fr.x][fr.y]]=1;
            sem=0;
            ++cam;
            for(int d=0;d<4;++d)
            {
                ii=fr.x+dx[d];
                jj=fr.y+dy[d];
                if(ok(ii,jj) && viz[ii][jj]==0)
                {
                    viz[ii][jj]=1;
                    if(c[a[ii][jj]])
                    {
                        dq.pf(mp(ii,jj));
                    }
                    else dq.pb(mp(ii,jj));
                }
            }
        }
        else
        {
            dq.pb(fr);
            if(sem==0)
            {
                init=fr;
                sem=1;
            }
            else if(fr==init && sem==1)sem=2;
        }
    }
    out<<cam;
    return 0;
}