Cod sursa(job #143953)

Utilizator cristiprgPrigoana Cristian cristiprg Data 26 februarie 2008 23:06:11
Problema Nunta Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
/*
Autor: Mihai Tabara
Punctaj: 100 puncte
Lang: C++
Prog: Alee
*/

#include <stdio.h>

#define in "alee.in"
#define out "alee.out"
#define NMAX 176
#define INF NMAX*NMAX + 5

const int di[] = { 0, 1, 0, -1 };
const int dj[] = { 1, 0, -1, 0 };

char a[NMAX][NMAX];
int b[NMAX][NMAX];
int c[NMAX*NMAX][2];
int m, n, prim, ultim;
int ip, jp, is, js, iv, jv;

int Ok( int, int );
void Dinamic();

int main()
{
    freopen ( in, "r", stdin );
    freopen ( out, "w", stdout );
    
    scanf( "%d%d", &n, &m );
    
    int k;
    int pozi, pozj;
    for ( k = 1; k <= m; ++k )
    {
        scanf( "%d%d", &pozi, &pozj );
        a[pozi][pozj] = 1;
    }
    scanf( "%d%d%d%d", &ip, &jp, &is, &js );
    
    Dinamic();
    printf( "%d\n", b[is][js] );
}

void Dinamic()
{
     int i, j, d;
     for ( i = 1; i <= n; ++i )
         for ( j = 1; j <= n; ++j )
             b[i][j] = INF;
     
     b[ip][jp] = 1;
     prim = ultim = 1;
     c[prim][0] = ip;
     c[prim][1] = jp;
     
     while ( prim <= ultim )
     {
           i = c[prim][0];
           j = c[prim][1];
           for ( d = 0; d < 4; ++d ) 
           {
               iv = i + di[d];
               jv = j + dj[d];
               if ( Ok(iv,jv) )
               {
                    if ( b[iv][jv] > b[i][j] + 1 )
                    {
                         b[iv][jv] = b[i][j] + 1;
                         ultim++;
                         c[ultim][0] = iv;
                         c[ultim][1] = jv;
                    }
               }
           }
           prim++;
     }
}

int Ok( int i, int j )
{
    if ( i < 1 || i > n || j < 1 || j > n ) return 0;
    if ( a[i][j] == 1 ) return 0;
    return 1;
}