Cod sursa(job #1247292)

Utilizator SmitOanea Smit Andrei Smit Data 22 octombrie 2014 16:37:46
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.58 kb
#include<fstream>
using namespace std;
int n, m, i, j, p, u, p1, u1, ii, jj, iv, jv, ii1, jj1, ii2, jj2, mid, d;
int a[1002][1002], c[2][1000*1000+1];
char b[1002][1002];
int di[4] = {1, -1, 0, 0};
int dj[4] = {0, 0, 1, -1};
char x;
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>> x;
            if(x == 'I'){
                ii1 = i;
                jj1 = j;
            }
            else{
                if(x == 'O'){
                    ii2 = i;
                    jj2 = j;
                }
                else{
                    if(x == 'D'){
                        u++;
                        c[0][u] = i;
                        c[1][u] = j;
                        a[i][j] = 1;
                    }
                    else{
                        if(x == '*'){
                            a[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(a[iv][jv] == 0 && iv >= 1 && iv <= n && jv >= 1 && jv <= m){
                a[iv][jv] = a[ii][jj] + 1;
                u++;
                c[0][u] = iv;
                c[1][u] = jv;
            }
        }
        p++;
    }
    p = 1;
    if(a[ii1][jj1] < a[ii2][jj2]){
        u = a[ii1][jj1] - 1;
    }
    else{
        u = a[ii2][jj2] - 1;
    }
    while(p <= u){
        mid = (p + u) / 2;
        p1 = 1;
        u1 = 1;
        c[0][1] = ii1;
        c[1][1] = jj1;
        b[ii1][jj1] = 1;
        while(p1 <= u1){
            ii = c[0][p1];
            jj = c[1][p1];
            for(d = 0; d < 4; d++){
                iv = ii + di[d];
                jv = jj + dj[d];
                if(a[iv][jv]  - 1>= mid && b[iv][jv] == 0){
                    u1++;
                    b[iv][jv] = 1;
                    c[0][u1] = iv;
                    c[1][u1] = jv;
                }
            }
            p1++;
            if(b[ii2][jj2] == 1){
                p = mid + 1;
                break;
            }
        }
        if(b[ii2][jj2] == 0){
            u = mid - 1;
        }
        for(i = 1; i <= n; i++){
            for(j = 1; j <= m; j++){
                b[i][j] = 0;
            }
        }
    }
    if(u < 1){
        fout<< -1;
        return 0;
    }
    fout<< u;
    return 0;
}