Pagini recente » Cod sursa (job #310626) | Cod sursa (job #513442) | Cod sursa (job #1500339) | Cod sursa (job #86778) | Cod sursa (job #1542506)
#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;
}