Cod sursa(job #2204116)

Utilizator GiihuoTihufiNeacsu Stefan GiihuoTihufi Data 14 mai 2018 17:43:35
Problema Castel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("castel.in");
ofstream g("castel.out");

int M,N,result=0;
int  T[151][151]={-1};

int nr=0;

vector<int> X,Y;
map<int,bool> K;

int Translate(int x,int y)
{
    return N*(x-1)+y;
}

pair<int,int> Translate(int c)
{
    return make_pair((c-1)/N+1,(c-1)%N+1);
}

void Mark(pair<int,int> P)
{
    K[Translate(P.first,P.second)]=1;
    T[P.first][P.second]=0;
    result++;
}

void AddXY(pair<int,int> P)
{
    X.push_back(P.first),Y.push_back(P.second);
    Mark(P);
}

bool Check(int x,int y)
{
    return(T[x][y]>0);
}

bool stop=false;

void Enter(int c)
{
    vector<int> X1,Y1;
    map<pair<int,int>,bool> Parsed;
    int marked=0;

    auto AddXY1 = [&X1,&Y1,&K,&Parsed,&marked](int x,int y,bool mark)
    {
        if(!Parsed[make_pair(x,y)]) X1.push_back(x),Y1.push_back(y);
        if(mark) Mark(make_pair(x,y)),marked++;
    };


    for(uint32_t i=0;i<X.size();i++)
    {
        bool canDelete=0;
        int x,y;
        x=X[i]; y=Y[i]-1;
        if(Check(x,y)) AddXY1(x,y,K[T[x][y]]);
        Parsed[make_pair(x,y)]=1;
        y=Y[i]+1;
        if(Check(x,y)) AddXY1(x,y,K[T[x][y]]);
        Parsed[make_pair(x,y)]=1;
        x=X[i]-1; y=Y[i];
        if(Check(x,y)) AddXY1(x,y,K[T[x][y]]);
        Parsed[make_pair(x,y)]=1;
        x=X[i]+1;
        if(Check(x,y)) AddXY1(x,y,K[T[x][y]]);
        Parsed[make_pair(x,y)]=1;
        //if(!canDelete) AddXY1(x,y);
        if(marked==0) stop=true;
    }
    X=X1,Y=Y1;
}


int main()
{
    int C;
    f>>M>>N>>C;
    for(int i=1;i<=M;i++)
        for(int j=1;j<=N;j++)
        {
            f>>T[i][j];
        }
    AddXY(Translate(C));
    while(!stop) Enter(C);

    g<<result;

    return 0;
}