Pagini recente » Cod sursa (job #136924) | Cod sursa (job #1350226) | Cod sursa (job #828477) | Cod sursa (job #1815168) | Cod sursa (job #176128)
Cod sursa(job #176128)
#include <fstream>
using namespace std;
fstream in,out;
long r,c;
long i,j,k;
long m[1005][1005];
long b[1005][1005];
long di[2000001],dj[2000001],ds[2000001];
long d=0,t;
long x,y,x1,y1;
long l,h,ma;
long maxim;
long suma;
char v[100];
int nr_max(long i,long j)
{
long x=0;
if(i>1 && m[i-1][j]>x) x=m[i-1][j];
if(j>1 && m[i][j-1]>x) x=m[i][j-1];
if(i<r && m[i+1][j]>x) x=m[i+1][j];
if(j<c && m[i][j+1]>x) x=m[i][j+1];
return x;
}
int nr_min(long x,long y)
{
if(x>y) return y;
else return x;
}
void umple(long i,long j,long k)
{
if(i>1 && m[i-1][j]>=k && b[i-1][j]==0) { b[i-1][j]=1; umple(i-1,j,k); }
if(j>1 && m[i][j-1]>=k && b[i][j-1]==0) { b[i][j-1]=1; umple(i,j-1,k); }
if(i<r && m[i+1][j]>=k && b[i+1][j]==0) { b[i+1][j]=1; umple(i+1,j,k); }
if(j<c && m[i][j+1]>=k && b[i][j+1]==0) { b[i][j+1]=1; umple(i,j+1,k); }
}
void goleste()
{
long i,j;
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
b[i][j]=0;
}
int main()
{
in.open("barbar.in",ios::in);
out.open("barbar.out",ios::out);
in>>r>>c;
in.get();
for(i=1;i<=r;i++)
{
in.getline(v,c+2,'\n');
for(j=0;j<c;j++)
{
if(v[j]=='.') m[i][j+1]=3000000;
else if(v[j]=='*') m[i][j+1]=0;
else if(v[j]=='D')
{
m[i][j+1]=0;
d++;
di[d]=i;
dj[d]=j+1;
}
else if(v[j]=='I')
{
m[i][j+1]=3000000;
x=i;
y=j+1;
}
else
{
m[i][j+1]=3000000;
x1=i;
y1=j+1;
}
}
}
in.close();
t=d;
for(i=1;i<=t;i++)
{
suma = m[di[i]][dj[i]]+1;
if(di[i]>1 && m[di[i]-1][dj[i]] > suma)
{
m[di[i]-1][dj[i]] = suma;
t++;
di[t]=di[i]-1;
dj[t]=dj[i];
}
if(di[i]<r && m[di[i]+1][dj[i]] > suma)
{
m[di[i]+1][dj[i]] = suma;
t++;
di[t]=di[i]+1;
dj[t]=dj[i];
}
if(dj[i]>1 && m[di[i]][dj[i]-1] > suma)
{
m[di[i]][dj[i]-1] = suma;
t++;
di[t]=di[i];
dj[t]=dj[i]-1;
}
if(dj[i]<c && m[di[i]][dj[i]+1] > suma)
{
m[di[i]][dj[i]+1] = suma;
t++;
di[t]=di[i];
dj[t]=dj[i]+1;
}
}
maxim=nr_min(nr_max(x,y),nr_max(x1,y1));
k=-1;
l=0;
h=maxim;
while(l<=h)
{
ma=(l+h)/2;
umple(x,y,ma);
if(b[x1][y1]==1)
{
k=ma;
l=ma+1;
}
else
h=ma-1;
goleste();
}
out<<k<<endl;
out.close();
return 0;
}