Cod sursa(job #1954610)

Utilizator sichetpaulSichet Paul sichetpaul Data 5 aprilie 2017 15:31:38
Problema Barbar Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.3 kb
#include <fstream>
#include <cstring>
using namespace std;
char a[1001][1001],ss[1001];
bool b[1001][1001];
int nn[1001][1001],s[1001][1001],v[1001][1001],e[1001][1001],col[1000*1000+1],lin[1000*1000+1];
int dlin[4]={-1,0,1,0};
int dcol[4]={0,1,0,-1};
int main()
{ int n,m,i,j,st,dr,mij,dist=0,l1,c1,lun,l,p,l2,c2;
bool ok,zid;
    ifstream f("barbar.in");
    ofstream g("barbar.out");
    f>>n>>m;
    f.get();
    for (i=1;i<=n;++i) {
        f.get(ss,1001);
        f.get();
        ok=zid=0;
        for (j=1;j<=m;++j) {
            a[i][j]=ss[j-1];
            if (a[i][j]=='I') {
                l1=i;
                c1=j;
            }
             if (a[i][j]=='O') {
                l2=i;
                c2=j;
             }
            if (a[i][j]=='D') {
                    ok=1;
                    zid=0;
            }
            if ((a[i][j]=='.' || a[i][j]=='I')  && ok) v[i][j]=v[i][j-1]+1;
            /*else if (a[i][j]=='*') {
                    zid=1;
                    ok=0;
            } */
        }
    }
       for (i=1;i<=n;++i) {
            ok=0;
            zid=0;
       for (j=m;j>=1;--j) {
           if (a[i][j]=='D') {
                ok=1;
                zid=0;
           }
           if ((a[i][j]=='.' || a[i][j]=='I') && ok) e[i][j]=e[i][j+1]+1;
          /* else if (a[i][j]=='*') {
                zid=1;
           ok=0;
           } */
       }}

          for (j=1;j<=m;++j) {
            ok=0;
            zid=0;
       for (i=1;i<=n;++i) {
           if (a[i][j]=='D') {
                ok=1;
                zid=0;
           }
           if ((a[i][j]=='.' || a[i][j]=='I') && ok) nn[i][j]=nn[i-1][j]+1;
           /*else if (a[i][j]=='*') {
                zid=1;
                ok=0;
                    }*/
       }}

          for (j=1;j<=m;++j) {
            ok=0;
            zid=0;
       for (i=n;i>=1;--i) {
           if (a[i][j]=='D') {
                ok=1;
                zid=0;
            }
           if ((a[i][j]=='.' || a[i][j]=='I') && ok) s[i][j]=s[i+1][j]+1;
           /*else if (a[i][j]=='*') {
                zid=1;
                ok=0; */
           }
       }

         st=1;
         dr=1000;
         while (st<=dr) {
            mij=(st+dr)/2;
            lun=l=1;
            lin[lun]=l1;
            col[lun]=c1;
            while (lun<=l) {
                for (p=0;p<4;++p) {
                        i=lin[lun]+dlin[p];
                        j=col[lun]+dcol[p];
                    if (b[i][j]==0 && i>=1 && i<=n && j>=1 && j<=m)
                        if (a[i][j]!='*')
                if ((nn[i][j]>=mij || nn[i][j]==0) && (s[i][j]>=mij || s[i][j]==0) && (e[i][j]>=mij || e[i][j]==0) && (v[i][j]>=mij || v[i][j]==0)) {
                        ++l;
                        lin[l]=i;
                        col[l]=j;
                        b[i][j]=1;
                        if (i==l2 && j==c2) break;
                }
                }
                  ++lun;
                  }
            if (b[l2][c2]==1) {
                dist=mij;
                st=mij+1;
            }
             else dr=mij-1;
               for (i=1;i<=n;++i)
                for (j=1;j<=m;++j)
                  b[i][j]=0;
         }
             g<<dist<<"\n";
    return 0;
}