Pagini recente » Cod sursa (job #2587200) | Cod sursa (job #327189) | Cod sursa (job #2418348) | Cod sursa (job #1995580) | Cod sursa (job #720738)
Cod sursa(job #720738)
#include<cstdio>
char a[1005][1005];
short l[1005][1005],dr[1005][1005];
int n,m,x1[1005],x2[1005],b1[1005],b2[1005];
bool viz[1005][1005];
inline int maxim(int a,int b){ if(a>b)return a; else return b; }
void readdata(){
freopen("barbar.in","r",stdin);
scanf("%d%d\n",&n,&m);
for(int i=0;i<n;++i)
scanf("%s\n",&a[i]);
fclose(stdin);
}
int main(void){
freopen("barbar.out","w",stdout);
int i,j,p1,p2,p3,p4,kd=0,kk,mx=0,mg=0;
readdata();
for(i=0;i<n;++i)
for(j=0;j<m;++j)
if(a[i][j]!='.' && a[i][j]!='*')
{
if(a[i][j]=='I'){ p1=i; p2=j; }
if(a[i][j]=='O'){ p3=i; p4=j; }
if(a[i][j]=='D'){
b1[++kd]=i;
b2[kd]=j;
}
}
for(i=1;i<=kd;++i)dr[b1[i]][b2[i]]=1; a[p1][p2]='.';
while(kd){
kk=0;
for(i=1;i<=kd;++i)
{
if(!dr[b1[i]+1][b2[i]] && b1[i]+1<n && a[b1[i]+1][b2[i]]=='.')
{ dr[b1[i]+1][b2[i]]=dr[b1[i]][b2[i]]+1; x1[++kk]=b1[i]+1; x2[kk]=b2[i]; }
if(!dr[b1[i]-1][b2[i]] && b1[i]-1>-1 && a[b1[i]-1][b2[i]]=='.')
{ dr[b1[i]-1][b2[i]]=dr[b1[i]][b2[i]]+1; x1[++kk]=b1[i]-1; x2[kk]=b2[i]; }
if(!dr[b1[i]][b2[i]+1] && b2[i]+1<m && a[b1[i]][b2[i]+1]=='.')
{ dr[b1[i]][b2[i]+1]=dr[b1[i]][b2[i]]+1; x1[++kk]=b1[i]; x2[kk]=b2[i]+1; }
if(!dr[b1[i]][b2[i]-1] && b2[i]-1>-1 && a[b1[i]][b2[i]-1]=='.')
{ dr[b1[i]][b2[i]-1]=dr[b1[i]][b2[i]]+1; x1[++kk]=b1[i]; x2[kk]=b2[i]-1; }
}
kd=kk;
for(i=1;i<=kd;++i){ b1[i]=x1[i]; b2[i]=x2[i]; }
}
b1[1]=p1; b2[1]=p2; kd=1; l[p1][p2]=1; a[p3][p4]='.';
while(kd){
kk=0;
for(i=1;i<=kd;++i)
{
if(a[b1[i]+1][b2[i]]=='.' && !l[b1[i]+1][b2[i]] && b1[i]+1<n)
{ l[b1[i]+1][b2[i]]=l[b1[i]][b2[i]]+1; x1[++kk]=b1[i]+1; x2[kk]=b2[i]; }
if(a[b1[i]-1][b2[i]]=='.' && !l[b1[i]-1][b2[i]] && b1[i]-1>-1)
{ l[b1[i]-1][b2[i]]=l[b1[i]][b2[i]]+1; x1[++kk]=b1[i]-1; x2[kk]=b2[i]; }
if(a[b1[i]][b2[i]+1]=='.' && !l[b1[i]][b2[i]+1] && b2[i]+1<m)
{ l[b1[i]][b2[i]+1]=l[b1[i]][b2[i]]+1; x1[++kk]=b1[i]; x2[kk]=b2[i]+1; }
if(a[b1[i]][b2[i]-1]=='.' && !l[b1[i]][b2[i]-1] && b2[i]-1>-1)
{ l[b1[i]][b2[i]-1]=l[b1[i]][b2[i]]+1; x1[++kk]=b1[i]; x2[kk]=b2[i]-1; }
}
kd=kk;
for(i=1;i<=kd;++i){ b1[i]=x1[i]; b2[i]=x2[i]; }
}
i=p3; j=p4;
while(i!=p1 || j!=p2){
mx=0;
viz[i][j]=1;
if(l[i+1][j]==l[i][j]-1 && !viz[i+1][j])mx=maxim(mx,dr[i+1][j]);
if(l[i-1][j]==l[i][j]-1 && !viz[i-1][j])mx=maxim(mx,dr[i-1][j]);
if(l[i][j+1]==l[i][j]-1 && !viz[i][j+1])mx=maxim(mx,dr[i][j+1]);
if(l[i][j-1]==l[i][j]-1 && !viz[i][j-1])mx=maxim(mx,dr[i][j-1]);
if(dr[i+1][j]==mx && l[i+1][j]==l[i][j]-1)++i;
if(dr[i-1][j]==mx && l[i-1][j]==l[i][j]-1)--i;
if(dr[i][j+1]==mx && l[i][j+1]==l[i][j]-1)++j;
if(dr[i][j-1]==mx && l[i][j-1]==l[i][j]-1)--j;
if(mg==0)mg=mx;
if(mx<mg)mg=mx;
}
printf("%d",mg);
return 0;
}