Pagini recente » Cod sursa (job #342787) | Cod sursa (job #3136938) | Cod sursa (job #3003146) | Cod sursa (job #1580011) | Cod sursa (job #2358189)
#include <iostream>
#include <cstdio>
using namespace std;
int n,m;
inline int verif(int x, int y)
{
return (x<=n && x>=1) && (y<=m && y>=1);
}
inline int mini(int a, int b)
{
if(a<b)
return a;
return b;
}
int mat[1003][1003],minime[1003][1003],ql[1000*1000+3],qc[1000*1000+3],dl[4]={0,0,1,-1},dc[4]={1,-1,0,0},b[1003][1003];
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
int i,j,si,sj,fi,fj,l,c,first,last,maxim=-1,st,dr,poz=-1,mij;
char a;
cin>>n>>m;
a=getchar();
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
minime[i][j]=1000*1000+1231;
a=getchar();
if(a=='D')
mat[i][j]=-2;
else if(a=='I')
{
si=i;
sj=j;
mat[si][sj]=1;
}
else if(a=='O')
{
fi=i;
fj=j;
}
else if(a!='.')
mat[i][j]=-1;
}
a=getchar();
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
if(mat[i][j]==-2)
{
first=1;
last=1;
ql[1]=i;
qc[1]=j;
minime[i][j]=0;
while(first<=last)
{
l=ql[first];
c=qc[first];
for(int k=0;k<=3;k++)
{
if(verif(l+dl[k],c+dc[k]) && minime[l][c]+1<minime[l+dl[k]][c+dc[k]] && mat[l+dl[k]][c+dc[k]]!=-1)
{
last++;
ql[last]=l+dl[k];
qc[last]=c+dc[k];
minime[l+dl[k]][c+dc[k]]=minime[l][c]+1;
}
}
first++;
}
}
}
st=1;
dr=mini(minime[fi][fj],minime[si][sj]);
while(st<=dr)
{
mij=(st+dr)/2;
first=last=1;
b[si][sj]=1;
ql[1]=si;
qc[1]=sj;
while(first<=last)
{
l=ql[first];
c=qc[first];
for(int k=0;k<=3;k++)
{
if(verif(l+dl[k],c+dc[k]) && minime[l+dl[k]][c+dc[k]]>=mij && b[i][j]==0 && mat[i][j]!=-1)
{
last++;
ql[last]=l+dl[k];
qc[last]=c+dc[k];
b[l+dl[k]][c+dc[k]]=b[l][c]+1;
}
}
first++;
}
if(b[fi][fj]>0)
{
poz=mij;
dr=mij-1;
}
else
st=mij+1;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
b[i][j]=0;
}
cout<<poz;
return 0;
}