Cod sursa(job #1542506)

Utilizator Julian.FMI Caluian Iulian Julian. Data 5 decembrie 2015 14:03:45
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <iostream>
#include <fstream>
#define nmax 1002
using namespace std;

struct punct{int x,y;}q[1000009],start,stop,a,aux;
int viz[nmax][nmax],vi[nmax][nmax];
int dx[]={0,1,0,-1},dy[]={-1,0,1,0};
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int main()
{char s[1007];
int r,c,in,sf,i,j;
    fin>>r>>c;
    fin.get();
    in=0;sf=-1;
    for(i=1;i<=r;i++)
    {
    fin.getline(s,1001);
    for(j=0;j<c;j++)
        if(s[j]=='.');else
        if(s[j]=='*')viz[i][j+1]=-1;else
            if(s[j]=='D'){q[++sf].x=i;q[sf].y=j+1;viz[i][j+1]=1;}else
                if(s[j]=='I'){start.x=i;start.y=j+1;}else
                {stop.x=i;stop.y=j+1;}
    }

    for(i=0;i<=r+1;i++)
        vi[i][0]=vi[i][c+1]=viz[i][0]=viz[i][c+1]=-1;
    for(i=0;i<=c+1;i++)
        vi[0][i]=vi[r+1][i]=viz[0][i]=viz[r+1][i]=-1;

    while(in<=sf)
    {a=q[in++];
    for(i=0;i<4;i++)
    {aux.x=a.x+dx[i];aux.y=a.y+dy[i];
        if(!viz[aux.x][aux.y])
        {viz[aux.x][aux.y]=viz[a.x][a.y]+1;
         q[++sf]=aux;

        }
    }
    }



int minim,ls,ld,m;
minim=0;
ls=1;ld=r+c+2;

while(ls<=ld)
{m=(ls+ld)/2;
for(i=1;i<=r;i++)
    for(j=1;j<=c;j++)
    vi[i][j]=0;
q[0]=start;in=0;sf=0;
if(viz[start.x][start.y]>=m){
vi[start.x][start.y]=1;
while(in<=sf && !vi[stop.x][stop.y])
    {a=q[in++];
        for(i=0;i<4;i++)
        {aux.x=a.x+dx[i];aux.y=a.y+dy[i];
        if(!vi[aux.x][aux.y] && viz[aux.x][aux.y]>=m)
           {vi[aux.x][aux.y]=1; q[++sf]=aux;}
        }

    }
  if(vi[stop.x][stop.y]){if(m>minim)minim=m;
  ls=m+1;} else ld=m-1;
}else ld=m-1;
}
fout<<minim-1;
}