Cod sursa(job #2517947)

Utilizator mihnea.anghelMihnea Anghel mihnea.anghel Data 4 ianuarie 2020 16:00:12
Problema Castel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>
#include <vector>
#define f in
#define g out

using namespace std;
ifstream in ( "castel.in" );
ofstream out( "castel.out" );
int n, m, i, j, k, p, u, c, l, poz;
int a[200][200], d[2][40000], fr[200][200], cheie[200][200];
int di[] = { 1, -1, 0, 0 };
int dj[] = { 0, 0, 1, -1 };
vector< pair < int, int > > v[40000];


int lin ( int poz ){
    if ( poz % m == 0 )
        return poz/m;
    return  poz/m+1;
}

int col ( int poz ){
    if ( poz % m == 0 )
        return m;
    return  poz % m;
}

int main() {
    f>>n>>m>>k;
    for ( i=1; i <= n; i++ )
        for ( j=1; j <= m; j++ )
            f>>a[i][j];
    l = 0; c = 1;
    p = u = 1;
    d[l][1] = lin(k);
    d[c][1] = col(k);
    fr[ lin(k) ][ col(k) ] = 1;
    while ( p <= u ){
        int ic = d[l][p];
        int jc = d[c][p];
        poz = (ic-1)*m + jc;
        cheie[ic][jc] = 1;
        for ( int i = 0; i < v[poz].size(); i++ ){
            d[l][++u] = v[poz][i].first;
            d[c][u] = v[poz][i].second;
        }
        for ( int i = 0; i < 4; i++ ){
            int iv = ic + di[i];
            int jv = jc + dj[i];
            if ( iv && jv && iv <= n && jv <= m && !fr[iv][jv] ){
                fr[iv][jv] = 1;
                if ( cheie[ lin(a[iv][jv]) ][ col(a[iv][jv]) ] ){
                    d[l][++u] = iv;
                    d[c][u] = jv;
                } else v[ a[iv][jv] ].push_back({iv,jv});
            }
        }
        p++;
    }
    int sol = 0;
    for ( i=1; i <= n; i++ )
        for ( j=1; j <= m; j++ )
            if ( cheie[i][j] )
                sol++;
    g<<sol;
    return 0;
}