Cod sursa(job #1424145)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 23 aprilie 2015 17:01:21
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include<fstream>
using namespace std;
int n, m, p, u, mid, d, ii, jj, iv, jv, ii1, jj1, ii2, jj2, st, dr, i, j;
int a[1002][1002], b[1002][1002];
int c[2][1000003];
int di[4] = {-1, 1, 0, 0};
int dj[4] = {0, 0, -1, 1};
char s;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int main(){
    fin>> n >> m;
    p = 1;
    for(i = 1; i <= n; i++){
        for(j = 1; j <= m; j++){
            fin>> s;
            if(s == 'D'){
                u++;
                c[0][u] = i;
                c[1][u] = j;
                b[i][j] = 1;
            }
            else{
                if(s == 'I'){
                    ii1 = i;
                    jj1 = j;
                }
                else{
                    if(s == 'O'){
                        ii2 = i;
                        jj2 = j;
                    }
                    else{
                        if(s == '*'){
                            a[i][j] = b[i][j] = -1;
                        }
                    }
                }
            }
        }
    }
    while(p <= u){
        ii = c[0][p];
        jj = c[1][p];
        for(d = 0; d < 4; d++){
            iv = ii + di[d];
            jv = jj + dj[d];
            if(iv >= 1 && iv <= n && jv >= 1 && jv <= m && b[iv][jv] == 0){
                u++;
                c[0][u] = iv;
                c[1][u] = jv;
                b[iv][jv] = b[ii][jj] + 1;
            }
        }
        p++;
    }
    st = 1;
    dr = min(b[ii1][jj1], b[ii2][jj2]);
    while(st <= dr){
        mid = (st + dr) / 2;
        for(i = 1; i <= n; i++){
            for(j = 1; j <= m; j++){
                a[i][j] = 0;
            }
        }

        p = u = 1;
        a[ii1][jj1] = 1;
        c[0][1] = ii1;
        c[1][1] = jj1;
        while(p <= u){
            ii = c[0][p];
            jj = c[1][p];
            for(d = 0; d < 4; d++){
                iv = ii + di[d];
                jv = jj + dj[d];
                if(iv >= 1 && iv <= n && jv >= 1 && jv <= m && b[iv][jv] > mid && a[iv][jv] == 0){
                    u++;
                    c[0][u] = iv;
                    c[1][u] = jv;
                    a[iv][jv] = a[ii][jj] + 1;
                }
            }
            p++;
        }
        if(a[ii2][jj2] == 0){
            dr = mid - 1;
        }
        else{
            st = mid + 1;
        }
    }
    if(dr < 1){
        dr = -1;
    }
    fout<< dr <<"\n";
    return 0;
}