Pagini recente » Cod sursa (job #1572375) | Cod sursa (job #1855652) | Cod sursa (job #2076417) | Cod sursa (job #494477) | Cod sursa (job #1329448)
#include<stdio.h>
struct str
{
int l,c;
str(int ll=0,int cc=0)
{
l=ll;
c=cc;
}
};
int lin[]={0,0,-1,1};
int col[]={1,-1,0,0};
str q[1000*1000+3],start,stop;
char x;
int a[1004][1004],b[1004][1004],n,m,l1,l2,mid,in,sf,maxi,sol;
int main()
{
int i,j;
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d ",&n,&m);
for(i=0;i<=n+1;i++)
a[i][0]=a[i][m+1]=-1;
for(i=0;i<=m+1;i++)
a[0][i]=a[n+1][i]=-1;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
scanf("%c ",&x);
if(x=='D'){
//a[i][j]=1;
sf++;
q[sf]=str(i,j);
}
if(x=='I')
start=str(i,j);
if(x=='*')
a[i][j]=-1;
if(x=='O')
stop=str(i,j);
}
in=1;
while(in<=sf)
{
for(int i=0;i<4;i++)
if(a[q[in].l+lin[i]][q[in].c+col[i]]==0)
{
a[q[in].l+lin[i]][q[in].c+col[i]]=a[q[in].l][q[in].c]+1;
sf++;
if(a[q[in].l][q[in].c]+1>maxi)
maxi=a[q[in].l][q[in].c]+1;
q[sf]=str(q[in].l+lin[i],q[in].c+col[i]);
}
in++;
}
l1=1;
in=sf=1;
q[in]=start;
l2=maxi;
while(l1<=l2)
{
for(int i=0;i<=n+1;i++)
for(int j=0;j<=m+1;j++)
{
if(a[i][j]==-1)
b[i][j]=-1;
else
b[i][j]=0;
}
in=sf=1;
mid=(l1+l2)/2;
b[start.l][start.c]=1;
if(a[start.l][start.c]>=mid)
while(in<=sf)
{
for(int i=0;i<4;i++)
if(a[q[in].l+lin[i]][q[in].c+col[i]]>=mid&&b[q[in].l+lin[i]][q[in].c+col[i]]==0&&a[q[in].l+lin[i]][q[in].c+col[i]]!=-1)
{
sf++;
q[sf]=str(q[in].l+lin[i],q[in].c+col[i]);
b[q[in].l+lin[i]][q[in].c+col[i]]=b[q[in].l][q[in].c]+1;
}
in++;
}
if(b[stop.l][stop.c]!=0)
{
if(mid>sol);
sol=mid;
l1=mid+1;
}
else
l2=mid-1;
}
printf("%d",sol);
return 0;
}