Cod sursa(job #3030780)

Utilizator tudorp_Pop Tudor tudorp_ Data 17 martie 2023 21:09:18
Problema Castel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <climits>
#include <vector>
#include <queue>

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

long long int cnt,m,n,dx[5]={-1,0,1,0},dy[5]={0,1,0,-1},i,j,ci,cas[151][151];

queue<int> q;
vector<int> backpack[20000];
bool key[20000];
bool access[20000];

bool inside(int i, int j)
{
    return (i>=1 && i<=m && j>=1 && j<=m);
}

struct pos{
    int x,y;
};

pair<int, int> pozitie(int s)
{
    int i, j ;
    if(s%m==0)
    {
        i = s/m;
        j = m;
    }
    else
    {
        i = s/m+1;
        j = s%m;
    }
    return {i,j};
}

int backk(int i, int j)
{
    return m*(i-1)+j;
}


void Lee()
{
    q.push(ci);
    key[ci] = 1;
    access[ci] = 1;
    while(!q.empty())
    {
        pair<int,int> p;
        int v = q.front();
        p = pozitie(v);
        q.pop();
        for(int d = 0; d < 4; d++)
        {
            int iv = p.first + dx[d], jv = p.second + dy[d];
            if(inside(iv,jv))
            {
                int nr = backk(iv,jv);
                if(!key[nr])
                {
                    if(access[cas[iv][jv]]==1)
                    {
                        access[nr] = 1;
                        key[nr] = 1;
                        q.push(nr);
                    }
                }
                else
                {
                    backpack[cas[iv][jv]].push_back(nr);
                }
            }
        }
        for(auto it: backpack[v])
        {
            if(!key[it])
            {
                q.push(it);
                key[it] = 1;
                access[it] = 1;
            }
        }
    }
}

void citire()
{
    fin>>m>>n>>ci;
    for(i=1;i<=m;i++)
    {
        for(j=1;j<=n;j++)
        {
            fin>>cas[i][j];
        }
    }
}



int main()
{
    citire();
    Lee();
    cnt = 0;
    for(i=1;i<=n*m;i++)
    {
        if(access[i])
            cnt++;
    }
    fout<<cnt;
}