Cod sursa(job #1856398)

Utilizator CodrutLemeniCodrut Lemeni CodrutLemeni Data 24 ianuarie 2017 20:10:28
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.16 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <queue>
#define N 1010
#define INF 10000

using namespace std;

int mindist [ N ][ N ];
int dist [ N ][ N ];
int inque [ N ][ N ];
int lin , col ;

deque < pair <int , int > > que ;

int dl [] ={ 0 , 1 , 0 , - 1 };
int dc [] ={ 1 , 0 , -1 , 0 };



void fill_drag (){
    int i , j , k , l , c;

    while( !que.empty() ){
        i = que.front().first ;
        j = que.front().second ;
        que.pop_front() ;

        inque [ i ][ j ] = 0;
        for ( k = 0 ; k < 4 ; k++ ){
            l = dl[ k ];
            c = dc[ k ];

            if ( i + l < lin && i + l >=0 && j + c < col &&  j + c >= 0 ){

                if ( dist [ i ] [ j ]  + 1 < dist [ i + l ] [ j + c ] ){
                    dist [ i + l ] [ j + c ] = dist [ i ] [ j ]  + 1 ;

                    if ( inque [ i + l ][ j + c ] ){
                        continue;
                    }else{
                        que.push_back( make_pair( i + l , j + c ) );
                        inque [ i + l ][ j + c ]= 1;
                    }

                }


            }


        }

    }

}

void lee (  ){

    int i , j , k , l , c;

    while( !que.empty() ){
        i = que.front().first ;
        j = que.front().second ;
        que.pop_front() ;
        inque [ i ][ j ] = 0;
        for ( k = 0 ; k < 4 ; k++ ){
            l = dl[ k ];
            c = dc[ k ];

            if ( i + l < lin && i + l >=0 && j + c < col &&  j + c >= 0 ){

                if ( mindist [ i ] [ j ] > mindist [ i + l ][ j + c ] && mindist [ i + l ] [ j + c ] != -2 ){

                    mindist [ i + l ][ j + c ] = min ( dist [ i + l ] [ j + c ] , mindist [ i ][ j ] );

                    if ( inque [ i + l ][ j + c ] ){
                        continue;
                    }else{
                        if ( mindist [ i + l ][ i + c ] == dist [ i + l ][ i + c ] ){
                            que.push_back( make_pair( i + l , j + c ) );
                        }else{
                            que.push_front( make_pair( i + l , j + c ) );
                        }
                        inque [ i + l ][ j + c ]= 1;
                    }
                }

            }


        }

    }


}


int main(){
    int  i , j ;
    char ch ;
    int sti ,stj ,soli , solj ;

    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);

    scanf("%d%d",&lin , &col );

    for ( i = 0 ; i <= lin ; i ++ ){
        for ( j = 0 ; j <= col ; j ++ ){
            dist [ i ][ j ] = INF ;
            mindist [ i ] [ j ] = -1;
        }
    }

    scanf("%c",&ch);
    for ( i = 0 ; i < lin ; i ++ ){
        for ( j = 0 ; j < col ; j ++ ){
            scanf("%c",&ch );
            if ( ch == 'D' ){
                que.push_front( make_pair( i , j ) );
                dist[ i ] [ j ] = 0;
            }else if ( ch == 'I' ){
                sti = i ;
                stj = j ;
            }else if ( ch == '*' ){
                mindist [ i ][ j ] = -2 ;
                dist [ i ][ j ] = -1 ;
            }else if ( ch == 'O'){
                soli = i ;
                solj = j ;
            }else{
            }
        }
        scanf("%c",&ch);
    }

    fill_drag ( );

//    for ( i = 0 ; i < lin ; i ++ ){
//        for ( j = 0 ; j < col ; j ++ ){
//            printf("%d ",dist [ i ][ j ]);
//
//        }
//        printf("\n");
//    }


//    for  ( i = 0 ; i < lin ; i ++ ){
//        for ( j  = 0 ; j < col ; j ++ ){
//            mindist[ i ][ j ] = 0 ;
//        }
//
//    }


    que.push_front(make_pair( sti , stj ) );
    mindist [ sti ] [ stj ] = dist [ sti ][ stj ];
//    for ( i = 0 ; i < lin ; i ++ ){
//        for ( j = 0 ; j < col ; j ++ ){
//            printf("%3d ",mindist [ i ][ j ]);
//
//        }
//        printf("\n");
//    }
    lee();

//    for ( i = 0 ; i < lin ; i ++ ){
//        for ( j = 0 ; j < col ; j ++ ){
//            printf("%3d ",mindist [ i ][ j ]);
//
//        }
//        printf("\n");
//    }


    printf("%d",mindist [ soli ][ solj ] );

    return 0;
}