Cod sursa(job #2004210)

Utilizator maria15Maria Dinca maria15 Data 25 iulie 2017 11:51:04
Problema Barbar Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.88 kb
#include <fstream>

using namespace std;
int dmaxloc;
char di[] = {1, 0, -1, 0};
char dj[] = {0, 1, 0, -1};
char d, ok=0, okg=0;
int dmax=1;
short int v[1001][1001];
short int c[2][1000*1000 + 1];
short int istart, jstart, ifinal, jfinal, i, j, n, nr, a[1001][1001], b, ic, jc, iv, jv, p, u, sol, m, ii, jj, maxim, st, dr, mid;

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

int main(){
    fin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++){
            fin>>d;
            if(d=='D'){
                v[i][j] = -1;
                c[0][++u]=i;
                c[1][u]=j;
            }
            if(d=='*')
                v[i][j] = -2;
            if(d=='I'){
                istart=i;
                jstart=j;
            }
            if(d=='O'){
                ifinal=i;
                jfinal=j;
            }
        }

    p=u=1;

    while(p<=u){                        // aflu distanta pana la cel mai apropiat dragon
        ic=c[0][p];                     // pentru fiecare celula
        jc=c[1][p];
        for(i=0;i<=3;i++){
            iv=ic+di[i];
            jv=jc+dj[i];
            if(iv>=1 && iv<=n && jv>=1 && jv<=m && v[iv][jv]==0){
                v[iv][jv]=v[ic][jc]+1;
                u++;
                c[0][u]=iv;
                c[1][u]=jv;
            }
        }
        p++;
    }


    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            v[i][j]++;


    c[0][1]=istart;
    c[1][1]=jstart;



    st=0;
    dr=v[istart][jstart];



    while(st<=dr){
        mid=(st+dr)/2;
        p=u=1;
        ok=0;
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
                a[i][j]=0;
        a[istart][jstart]=1;
        while(p<=u){
            ic=c[0][p];
            jc=c[1][p];
            for(i=0;i<=3;i++){
                iv=ic+di[i];
                jv=jc+dj[i];
                if(iv>=1 && iv<=n && jv>=1 && jv<=m && v[iv][jv]>=mid && a[iv][jv]==0){
                    u++;
                    c[0][u]=iv;
                    c[1][u]=jv;
                    a[iv][jv]=a[ic][jc]+1;
                    if(iv == ifinal && jv == jfinal){   // daca am putut ajunge la iesirea din temnita cu mid
                        if(mid>sol){
                            sol=mid;
                           // nr=a[iv][jv];
                        }
                        ok=1;
                        okg=1;        // se poate iesi din temnita
                        //p=u+1;       // avem cel putin o cale de iesire din temnita cu mid, asa ca nu mai incercam alte drumuri
                        break;
                    }
                }
            }
            p++;
        }
        if(ok==1)
            st=mid+1;
        else
            dr=mid-1;
    }


    if(okg==1)
        fout<<sol;
    else
        fout<<"-1";

    //fout<<nr;
    return 0;
}