Cod sursa(job #2124129)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 6 februarie 2018 22:10:39
Problema Castel Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <fstream>
#include <vector>
#include <queue>
#define VAL 22505

using namespace std;

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

int N, M, K, i, j, nr, ANS;
int ch[VAL], l, c, nod;
bool deb[VAL], gas, dp[VAL];
vector <int> vec[VAL];
queue <int> Q;

int Trans(int lin, int col)
{
    return (lin-1)*M+col;
}

void BFS()
{
    while (Q.empty()==false)
    {
        nod=Q.front();
        Q.pop();
        for (j=0; j<vec[nod].size(); j++)
        {
            if (deb[ch[vec[nod][j]]]==true && dp[vec[nod][j]]==false)
            {
                deb[vec[nod][j]]=true;
                dp[vec[nod][j]]=true;
                Q.push(vec[nod][j]);
            }
        }
    }
}

int main()
{
    fin >> N >> M >> K;
    for (i=1; i<=N; i++)
    {
        for (j=1; j<=M; j++)
        {
            fin >> ch[++nr];
            l=i-1;
            c=j;
            if (l>=1)
              vec[nr].push_back(Trans(l, c));
            l=i+1;
            if (l<=N)
              vec[nr].push_back(Trans(l, c));
            c=j-1;
            l=i;
            if (c>=1)
              vec[nr].push_back(Trans(l, c));
            c=j+1;
            if (c<=M)
              vec[nr].push_back(Trans(l, c));
        }
    }
    dp[K]=true;
    deb[ch[K]]=true;
    while (1)
    {
        gas=false;
        for (i=1; i<=N*M; i++)
        {
            if (dp[i]==true)
            {
                nr=0;
                for (j=0; j<vec[i].size(); j++)
                {
                    if (dp[vec[i][j]]==false && deb[ch[vec[i][j]]]==true)
                    {
                        gas=true;
                        nr++;
                    }
                }
                if (nr>0)
                  Q.push(i);
            }
        }
        if (gas==false)
          break;
        BFS();
    }
    for (i=1; i<=N*M; i++)
      if (dp[i]==true)
        ANS++;
    fout << ANS << '\n';
    fin.close();
    fout.close();
    return 0;
}