Cod sursa(job #1866079)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 2 februarie 2017 16:55:59
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.96 kb
#include <fstream>

using namespace std;

ifstream fin ("barbar.in");
ofstream fout ("barbar.out");
int n,m,i,j,a[1001][1001],c[2][1000001],k,p,u,st,dr,mid,ok,istart,jstart;
int ifin,jfin,ic,jc,iv,jv,d,b[1001][1001],okk;
int di[] = {1,-1,0,0};
int dj[] = {0,0,1,-1};
char x;
int main (){

    fin>>n>>m;
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++){
            fin>>x;
            if (x == '*'){
                a[i][j] = -1;
                b[i][j] = -1;
            }
            if (x == 'D'){
                k++;
                c[0][k] = i; // punem in coada dragonul
                c[1][k] = j;
                //v[k].f = i;
                //v[k].s = j;
               // a[i][j] = -1;
                b[i][j] = -1;
            }
            if (x == 'I'){
                istart = i;
                jstart = j;
            }
            if (x == 'O'){
                ifin = i;
                jfin = j;
            }
        }

    p = 1;
    u = k;
    while (p<=u){
        ic = c[0][p];
        jc = c[1][p];
        for (d=0;d<=3;d++){
            iv = ic+di[d];
            jv = jc+dj[d];
            if (iv>=1&&iv<=n&&jv>=1&&jv<=m&&a[iv][jv]==0){
                u++;
                c[0][u] = iv;
                c[1][u] = jv;
                a[iv][jv] = 1+a[ic][jc];
            }
        }
        p++;
    }
    // cuatam binar;
    st = 1;
    dr = max(n,m)*max(n,m)/2;
    while (st <= dr){
        mid = (st+dr)/2;
        // verificam daca exista drum intre istart,jstart si ifin,jfin
        // care sa treaca doar prin elemente mai mari sau egala cu mid;
        ok = 0;
        p = 1;
        u = 1;
        c[0][1] = istart;
        c[1][1] = jstart;
        if (a[istart][jstart] >= mid){
            while (p<=u){
                ic = c[0][p];
                jc = c[1][p];
                for (d=0;d<=3;d++){
                    iv = ic+di[d];
                    jv = jc+dj[d];
                    if (iv>=1&&iv<=n&&jv>=1&&jv<=m&&a[iv][jv]>=mid&&b[iv][jv]==0){
                        u++;
                        c[0][u] = iv;
                        c[1][u] = jv;
                        b[iv][jv] = 1+b[ic][jc];
                        //a[iv][jv] = 1+a[ic][jc];
                        if (iv==ifin && jv==jfin){
                            ok = 1;
                            okk=1;
                        }
                    }
                }
                p++;
            }
        }
        if (ok == 1)
            st = mid+1;
        else
            dr = mid-1;
        for (i=1;i<=n;i++)
            for (j=1;j<=m;j++)
                if (b[i][j] != -1)
                    b[i][j] = 0;
    }
    //if (dr == 0){
      //  fout<<0;
        //return 0;
    //}
//    for (i=1;i<=n;i++){
  //      for (j=1;j<=m;j++)
    //        fout<<a[i][j]<<" ";
      //  fout<<"\n";
    //}
    if (okk == 0)
        fout<<0;
    else
        fout<<dr;

    return 0;
}