Cod sursa(job #845692)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 31 decembrie 2012 13:30:20
Problema Castel Scor 100
Compilator cpp Status done
Runda pregatire_oni_baraj_juniori Marime 1.88 kb
#include<stdio.h>
#include<queue>
#include<algorithm>
#define x first
#define y second
using namespace std ;
queue < pair < long , long > > q , p ;
pair < long , long > temp ;
bool cod [ 150 * 150 + 7 ] , viz [ 157 ] [ 157 ] ;
long dx [ ] = { 0 , 1 , -1 , 0 , 0  } ;
long dy [ ] = { 0 , 0 , 0  , 1 , -1 } ;
long nr , n , m , k , a [ 157 ] [ 157 ] ;
int main ( )
{
    freopen ( "castel.in" , "r" , stdin ) ;
    freopen ( "castel.out" , "w" , stdout ) ;
    scanf ( "%ld %ld %ld" , & n , & m , & k ) ;
    for ( long i = 1 ; i <= n ; ++ i )
        for ( long j = 1 ; j <= m ; ++ j )
        {
            scanf ( "%ld" , & a [ i ] [ j ] ) ;
            nr ++ ;
            if ( nr == k )
            {
                cod [ a [ i ] [ j ] ] = 1 ;
                q . push ( make_pair ( i , j ) ) ;
            }
        }
    nr = 0 ;
    long ok = 1 , nr2 ;
    while ( ok == 1 )
    {
        ok = 0 ;
        nr2 = 0 ;
        while ( ! q . empty ( ) )
        {
            temp = q . front ( ) ;
            for ( long i = 1 ; i <= 4 ; ++ i )
            {
                temp . x += dx [ i ] ;
                temp . y += dy [ i ] ;
                if ( cod [ a [ temp . x ] [ temp . y ] ] == 1 && viz [ temp . x ] [ temp . y ] == 0 )
                {
                    q . push ( temp ) ;
                    cod [ ( temp . x - 1 ) * m + temp . y ] = 1 ;
                    viz [ temp . x ] [ temp . y ] = 1 ;
                    ok = 1 ;
                    ++ nr ;
                }
                temp . x -= dx [ i ] ;
                temp . y -= dy [ i ] ;
            }
            q . pop ( ) ;
            p . push ( temp ) ;
        }
        while ( ! p . empty ( ) )
        {
            temp = p . front ( ) ;
            q . push ( temp ) ;
            p . pop ( ) ;
        }
    }
    printf ( "%ld" , nr ) ;
    return 0 ;
}