Cod sursa(job #2577973)

Utilizator NashikAndrei Feodorov Nashik Data 10 martie 2020 11:09:40
Problema Castel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
//#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;
ifstream cin("castel.in");
ofstream cout("castel.out");
queue <int> q;
int diri[]={0,0,1,-1};
int dirj[]={1,-1,0,0};
int v[200][200],find_cheie[200][200],n,m,viz[200][200],ajuns[200][200];
vector<pair<int,int> > ceva[25000];
pair<int,int> coord(int k){
    int a,b;
    if(k%m==0){
        b=m;
        a=k/m;
    }
    else{
        b=k%m;
        a=k/m+1;
    }
    return make_pair(a,b);
}
int cord(int a,int b){
    if(b==m){
        return a*m;
    }
    else
        return (a-1)*m+b;
}
int main()
{
    int k;
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>v[i][j];
            ceva[v[i][j]].push_back(make_pair(i,j));
        }
    }
    int a,b;
    if(k%m==0){
        b=m;
        a=k/m;
    }
    else{
        b=k%m;
        a=k/m+1;
    }
    q.push(k);
    int contor=0;
    while(q.empty()==false){
        int x=q.front();
        q.pop();
        a=coord(x).first;
        b=coord(x).second;
        if(viz[a][b]==1)
            continue;
        //cout<<a<<" "<<b<<"\n";
        contor++;
        viz[a][b]=1;
        for(auto u:ceva[x]){
            find_cheie[u.first][u.second]=1;
            if(ajuns[u.first][u.second]>0){
                q.push(cord(u.first,u.second));
            }
        }
        for(int i=0;i<4;i++){
            ajuns[a+diri[i]][b+dirj[i]]++;
            if(find_cheie[a+diri[i]][b+dirj[i]]==1 and ajuns[a+diri[i]][b+dirj[i]]==1){
                q.push(cord(a+diri[i],b+dirj[i]));
            }
        }
    }
    cout<<contor;
    return 0;
}