Cod sursa(job #2985835)

Utilizator SeracovanuEdwardSeracovanu Edward SeracovanuEdward Data 27 februarie 2023 10:41:02
Problema Castel Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <bits/stdc++.h>

using namespace std;

const int nmax = 150 * 150 + 5;

int n , m , k;
int viz[nmax];
int acc[nmax];
int A[nmax];

vector <int> adj[nmax];

void _add(int val,int i,int j){
if(i < 1 || j < 1 || i > n || j > n)return;
adj[val].push_back(m * (i - 1)  + j);
}


void dfs(int nod){
viz[nod] = 1;
acc[nod] = 1;
for(auto x:adj[nod]){
    if(!viz[x] && acc[A[x]]){
        dfs(x);
    }
}
}

int main()
{
    freopen("castel.in" , "r" , stdin);
    freopen("castel.out" , "w" , stdout);
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    cin >> n >> m >> k;
    for(int i = 1;i <= n; ++i)
        for(int j = 1;j <= m; ++j){
            int val = m * (i - 1) + j;
            cin >> A[val];
            _add(val , i - 1, j);
            _add(val , i + 1, j);
            _add(val , i , j - 1);
            _add(val , i , j + 1);

        }
  /**  for(int i = 1;i <= n * m; ++i){
        cout << i << " : ";
        for(auto x:adj[i])
            cout << x << " ";
        cout << "\n";
    }**/
    dfs(k);
    for(int i = 1;i <= n * m; ++i)viz[i] = 0;
    dfs(k);
    for(int i = 1;i <= n * m; ++i)viz[i] = 0;
    dfs(k);
    int cnt = 0;
    for(int i = 1;i <= n * m; ++i)
        if(viz[i] > 0)
            cnt++;
    cout << cnt;
}