Cod sursa(job #844439)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 29 decembrie 2012 12:35:06
Problema Castel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include<stdio.h>
#include<queue>
#include<algorithm>
#define x first
#define y second
using namespace std ;
queue < pair < long , long > > q ;
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 = 1 ;
    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 ) ;
                ++ nr ;
                cod [ ( temp . x - 1 ) * m + temp . y ] = 1 ;
                viz [ temp . x ] [ temp . y ] = 1 ;
            }
            temp . x -= dx [ i ] ;
            temp . y -= dy [ i ] ;
        }
        q . pop ( ) ;
    }
    printf ( "%ld" , nr ) ;
    return 0 ;
}