Cod sursa(job #1304737)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 29 decembrie 2014 11:18:35
Problema Barbar Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <fstream>
using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");

int n, m, i, j, k, ok, minim, maxim;
int a[1001][1001], b[3][1000001], d;
int diri[5] = {0,-1, 0, 1, 0};
int dirj[5] = {0, 0, 1, 0,-1};
int ic, jc, iv, jv, p, u, val;
int istart, jstart, ifin, jfin;
int c[1001][1001], dr, st, mid;
char x; int v;

void sol(){
    fout << dr;
    return;
}

void fill(int ic, int jc, int val){
    if(v == 1){
        c[ic][jc] = 0;
        return;
    }
    if(c[ic][jc] == 1)
        return;
    c[ic][jc] = 1;
    if(ic >= 1 && ic <= n)
        if(jc >= 1 && jc <= m)
            if(a[ic][jc] != -1)
                if(a[ic][jc] >= mid){
                    if(ic == ifin && jc == jfin){
                        ok = 1; v = 1;
                    }
                    else{
                        for(int d = 1; d <= 4; d ++){
                            int iv = ic + diri[d];
                            int jv = jc + dirj[d];
                            fill(iv, jv, val);
                        }
                    }
                }
    c[ic][jc] = 0;
    return;
}

void bin(){
    st = 1; dr = maxim;
    while(st <= dr){
        mid = (st + dr) / 2;
        ok = 0; val = 0;
        fill(istart, jstart, mid);
        if(ok == 1)
            st = mid + 1;
        else
            dr = mid - 1;
    }
    return;
}

void lee(){
    while(p <= u){
        ic = b[1][p]; jc = b[2][p];
        for(d = 1; d <= 4; d ++){
            iv = ic + diri[d];
            jv = jc + dirj[d];
            if(iv >= 1 && iv <= n)
                if(jv >= 1 && jv <= m)
                    if(a[iv][jv] == 0){
                        u ++;
                        b[1][u] = iv;b[2][u] = jv;
                        a[iv][jv] = a[ic][jc] + 1;
                        if(a[iv][jv] > maxim)
                            maxim = a[iv][jv];
                    }
        }
        p ++;
    }
    return;
}

void read(){
    fin >> n >> m; p = 1;
    for(i = 1; i <= n; i ++)
        for(j = 1; j <= m; j ++){
            fin >> x;
            if(x == 'I'){
                istart = i;
                jstart = j;
            }
            if(x == 'O'){
                ifin = i;
                jfin = j;
            }
            if(x == '*'){
                a[i][j] = -1;
            }
            if(x == 'D'){
                u ++;
                b[1][u] = i;
                b[2][u] = j;
            }
        }
    return;
}

int main(){
    read();lee();
    bin(); sol();
    return 0;
}