Pagini recente » Cod sursa (job #2175616) | Cod sursa (job #1660857) | Cod sursa (job #20478) | Cod sursa (job #2560139) | Cod sursa (job #2364294)
#include <fstream>
#include <iostream>
#define dim 1010
#define x first
#define y second
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
long long n,m,i,j,d[dim][dim],is,js,it,jt,st,dr,mid,cnt;
char s;
pair<int,int> c[dim*dim];
int p,u;
bool a[dim][dim];
bool v[dim][dim];
int D;
int di[]={-1,0,0,1};
int dj[]={0,-1,1,0};
int ic,jc,iv,jv;
int main(){
fin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
fin>>s;
if(s=='I')
is=i,js=j;
if(s=='D'){
c[++u]=make_pair(i,j);
d[i][j]=1;
}
if(s=='*')
a[i][j]=1;
if(s=='O')
it=i,jt=j;
}
p=1;
while(p<=u){
ic=c[p].x; jc=c[p].y;
for(D=0;D<4;D++){
iv=ic+di[D]; jv=jc+dj[D];
if(iv>0 && jv>0 && iv<=n && jv<=m){
if(!d[iv][jv] && !a[iv][jv]){
d[iv][jv]=d[ic][jc]+1;
c[++u]=make_pair(iv,jv);
}
}
}
p++;
}
st=1; dr=d[c[u].x][c[u].y];
while(st<=dr){
mid=(dr+st)/2;
p=1; u=1;
c[u]=make_pair(is,js);
v[is][js]=1;
while(p<=u && !v[it][jt]){
ic=c[p].x; jc=c[p].y;
for(D=0;D<4;D++){
iv=ic+di[D]; jv=jc+dj[D];
if(iv>0 && jv>0 && iv<=n && jv<=m){
if(d[iv][jv]>=mid && !v[iv][jv]){
v[iv][jv]=1;
c[++u]=make_pair(iv,jv);
}
}
}
p++;
}
if(v[it][jt])
st=mid+1;
else
dr=mid-1;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
v[i][j]=0;
}
st=0;
fout<<max(dr-1,st);
return 0;
}