Cod sursa(job #1555073)

Utilizator andreisontea01Andrei Sontea andreisontea01 Data 22 decembrie 2015 11:27:22
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.16 kb
#include <cstdio>
#include <queue>

using namespace std;


const int inf = (1 << 29) - 1;
char harta[1001][1001];

bool obst[1001][1001];

int best[1001][1001];

int n, m;

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

int stx, sty,
    fnx, fny;

bool okd(int ii, int jj){
    if(ii >= 1 && ii <= n && jj >= 1 && jj <= m){
        if(harta[ii][jj] == '.' || harta [ii][jj] == 'I'){
            return true;
        }
        return false;
    }
    return false;
}


int dragon[1001][1001];

int dist(){
    queue < pair<int, int> > qd;

    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= m;j++){
            if(harta[i][j] == 'D'){
                dragon[i][j] = 0;
                qd.push(make_pair(i, j));
            }
            else{
                dragon[i][j] = inf;
            }
        }
    }

    while(!qd.empty()){
        pair <int, int> cel = qd.front();
        qd.pop();
        for(int d = 0;d < 4;d++){
            int ii = cel.first + di[d];
            int jj =  cel.second + dj[d];
            if(okd(ii, jj)){
                int celula = dragon[cel.first][cel.second] + 1;
                if(celula < dragon[ii][jj]){
                    qd.push(make_pair(ii, jj));
                    dragon[ii][jj] = celula;
                }
            }
        }
    }


}

bool ok(int ii, int jj, int D){
    if(ii >= 1 && ii <= n && jj >= 1 && jj <= m){
        if(harta[ii][jj] == '.' || harta[ii][jj] == 'O'){
            if(dragon[ii][jj] < D){
                return false;
            }
            return true;
        }
        return false;
    }
    return false;
}

bool lee(int D){


    queue < pair<int, int> > q;

    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= m;j++){
            best[i][j] = inf;
        }
    }
    best[stx][sty] = 0;
    if((dragon[stx][sty] >= D)){
        q.push(make_pair(stx, sty));
    }
    while(!q.empty()){
        pair <int, int> cel = q.front();
        q.pop();
        for(int d = 0;d < 4;d++){
            int ii = cel.first + di[d];
            int jj =  cel.second + dj[d];
            if(ok(ii, jj, D)){
                int pas = best[cel.first][cel.second] + 1;
                if(pas < best[ii][jj]){
                    q.push(make_pair(ii, jj));
                    best[ii][jj] = pas;
                }
            }
        }
    }

    if(best[fnx][fny] < inf){
        return true;
    }
    else{
        return false;
    }
}

int sarci(int st, int dr, int last){
    if(st > dr){
        return last;
    }
    int mij = (st + dr) / 2;
    if(lee(mij)){
        st = mij + 1;
        last = mij;
    }
    else{
        dr = mij - 1;
    }
    return sarci(st, dr, last);
}

int main()
{
    FILE *fin, *fout;
    fin = fopen("barbar.in","r");
    fout = fopen("barbar.out","w");
    int i, j;
    fscanf(fin,"%d%d\n",&n,&m);
    for(i = 1;i <= n;i++){
        for(j = 1;j <= m;j++){
            fscanf(fin,"%c\n",&harta[i][j]);
            if(harta[i][j] == 'I'){
                stx = i;
                sty = j;
            }
            if(harta[i][j] == 'O'){
                fnx = i;
                fny = j;
            }
        }
    }

    dist();

    fprintf(fout,"%d\n",sarci(1, (n * m) + 1, -1));
    return 0;
}