Cod sursa(job #2958448)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 26 decembrie 2022 17:11:41
Problema Castel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <fstream>
#include <vector>

#pragma GCC optimize ("O3")
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")

using namespace std;

ifstream cin( "castel.in" );
ofstream cout( "castel.out" );

const int MAX = 22501;
vector<int> G[ MAX ];
bool viz[ MAX ];
int v[ MAX ];
int n, m, x;
int rez;

int test( int i ) {    
    return ( ( i % m != 0 && viz[ i - 1 ] ) || ( i % m != m - 1 && viz[ i + 1 ] ) || ( i + m < n * m && viz[ i + m ] ) || ( i - m >= 0 && viz[ i - m ] ) );
}

void Fill( const int& i ) {
    if( viz[ i ] )
        return;

    rez++;
    viz[ i ] = 1;
    if( i % m != 0 && viz[ v[ i - 1 ] ] )
        Fill( i - 1 );
    if( i % m != m - 1 && viz[ v[ i + 1 ] ] )
        Fill( i + 1 );  
    if( i + m < n * m && viz[ v[ i + m ] ] )
        Fill( i + m );
    if( i - m >= 0 && viz[ v[ i - m ] ] )
        Fill( i - m );

    for( const int& it : G[ i ] )
        if( test( it ) )
            Fill( it );  
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> m >> x;
    x--;
    int right = n * m;
    for( int i = 0; i < right; i++ ) {
        cin >> v[ i ];
        v[ i ]--;
        G[ v[ i ] ].push_back( i );
    }

    Fill( x );

    cout << rez << '\n';
    return 0;
}