Cod sursa(job #1947846)

Utilizator MihaelaCismaruMihaela Cismaru MihaelaCismaru Data 31 martie 2017 14:18:54
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.9 kb
#include<fstream>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
int dx[5]={0,1,-1,0,0},dy[5]={0,0,0,-1,1};
int n,m,i,j,st,dr,a,b,c,d,beta,alfa,sta,dra,ai,bi,mid,maxim,ok;
char q;
int mat[1005][1005],w[1005][1005],dragon[1005][1005];
pair<short,short>v[1000100];
int main(){
    in>>n>>m;
    for(i=1;i<=n;i++){
        for( j = 1; j <= m; j ++ ){
            in>>q;
            if(q=='.'){
                mat[i][j]=0;
            }
            if(q=='D'){
                mat[i][j]=-2;
                w[i][j]=1;
            }
            if(q=='*'){
                mat[i][j]=-1;
            }
            if(q=='I'){
                mat[i][j]=1;
                ai=i;
                bi=j;
            }
            if(q=='O'){
                alfa=i;
                beta=j;
            }
        }
    }
    dr=0;
    for( i = 1; i <= n; i ++ ){
        for( j = 1; j <= m; j ++ ){
            if( w[ i ][ j ] == 1 ){
                dr++;
                v[ dr ].first = i;
                v[ dr ].second = j;
            }
        }

    }
    for( st = 1; st <= dr; st ++ ){
        for( i = 1; i <= 4; i ++ ){
            a=v[st].first;
            b=v[st].second;
            c=a+dx[i];
            d=b+dy[i];
            if( c >= 1 && d >= 1 && c<= n && d<= m && w[ c ][ d ] == 0 ){
                dr ++;
                v[ dr ].first = c;
                v[ dr ].second = d;
                w[ c ][ d ] = w[ a ][ b ] + 1;
                if( w[ c ][ d ] > maxim ){
                    maxim = w[ c ][ d ];
                }
            }
        }
    }
    for( st = 1, dr = maxim; st <= dr;){
        mid = ( st + dr )/2;
        dragon[ai][bi]=1;
        ok=1;
        for( i = 1; i <= n; i ++ ){
            for( j = 1; j <= m; j ++ ){
                if( w[i][j] < mid || mat[i][j]==-1){
                    dragon[i][j]=-1;
                }
                else{
                    dragon[ i ][ j ]=0;
                }
            }
        }
        if(dragon[ai][bi]==-1){
            ok=0;
        }
        else{
            for( sta = 1, dra = 1; sta <= dra; sta ++ ){
                for( i = 1; i <= 4; i ++ ){
                    a=v[ sta ].first;
                    b=v[ sta ].second;
                    c=a+dx[ i ];
                    d=b+dy[ i ];
                    if( c <= n && d <= n && c >= 1 && d >= 1 && dragon[ c ][ d ] == 0 ){
                        dra ++;
                        v[ dra ].first = c;
                        v[ dra ].second = d;
                        dragon[ c ][ d ] = dragon[ a ][ b ] + 1;
                    }
                }
            }
        }
        if( dragon[ alfa ][ beta ] <= 0){
            ok=0;
        }
        if(ok==1){
            st=mid+1;
        }
        else{
            dr=mid-1;
        }

    }
    out<<dr;



    return 0;
}