Pagini recente » Cod sursa (job #2072426) | Cod sursa (job #1313232) | Cod sursa (job #1427696) | Cod sursa (job #1433039) | Cod sursa (job #2288851)
#include<fstream>
#include<iomanip>
#include<cstring>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
int x1,y1,x2,y2,n,m,a[1005][1005];
int x[1000005],y[1000005],s=1,d;
int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};
char c[1005][1005];
int succes(int k){
if(a[x1][y1]<k) return 0;
memset(c,0,sizeof(c));
s=d=1;
x[1]=x1; y[1]=y1;
c[x1][y1]=1;
while(s<=d){
for(int i=0;i<4;i++){
int xx=x[s]+dx[i],yy=y[s]+dy[i];
if(!c[xx][yy] && a[xx][yy]>=k){
if(xx==x2 && yy==y2) return 1;
c[xx][yy]=1;
++d;
x[d]=xx; y[d]=yy;
}
}
++s;
}
return 0;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>(c[i]+1);
for(int i=0;i<=n+1;i++) a[i][0]=a[i][m+1]=-1;
for(int i=0;i<=m+1;i++) a[0][i]=a[n+1][i]=-1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(c[i][j]=='I'){
x1=i; y1=j;
}
else if(c[i][j]=='O'){
x2=i; y2=j;
}
else if(c[i][j]=='D'){
a[i][j]=1;
++d;
x[d]=i; y[d]=j;
}
while(s<=d){
for(int i=0;i<4;i++){
int xx=x[s]+dx[i],yy=y[s]+dy[i];
if(!a[xx][yy]){
a[xx][yy]=a[x[s]][y[s]]+1;
++d;
x[d]=xx; y[d]=yy;
}
}
++s;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(c[i][j]=='*')
a[i][j]=0;
--a[i][j];
}
int st=0,dr=max(n,m);
while(dr-st>1){
int mid=(st+dr)>>1;
if(succes(mid)) st=mid;
else dr=mid;
}
if(!succes(st)) cout<<-1;
else cout<<st;
}