Pagini recente » Cod sursa (job #1461452) | Cod sursa (job #1644904) | Cod sursa (job #387939) | Cod sursa (job #2830594) | Cod sursa (job #2364709)
#include <fstream>
#define x first
#define y second
#define DIM 1003
using namespace std;
ifstream fin ("barbar.in");
ofstream fout("barbar.out");
char c;
pair<int, int> D[DIM*DIM],k[DIM*DIM],s,f;
int n,m,i,j,x,y,a[DIM][DIM],w[DIM][DIM],v[DIM][DIM],t,d,q,st,dr,mid,maxim,ok;
int di[4]={1,-1,0,0};
int dj[4]={0,0,1,-1};
int main(){
fin>>n>>m;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++){
fin>>c;
switch(c){
case 'D': D[++d]=make_pair(i,j);break;
case '*': w[i][j]=1;break;
case 'I': s.x=i;s.y=j;break;
case 'O': f.x=i;f.y=j;break;
}
}
for (q=1;q<=d;q++){
st=dr=1;
k[st]=D[q];
a[k[st].x][k[st].y]=1;
while (st<=dr){
for (t=0;t<4;t++){
x=k[st].x+di[t];
y=k[st].y+dj[t];
if (x>0 && x<=n && y>0 && y<=m && !w[x][y] && (!a[x][y] || a[x][y]>a[k[st].x][k[st].y]+1)){
a[x][y]=a[k[st].x][k[st].y]+1;
k[++dr]=make_pair(x,y);
}
}
st++;
}
}
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
maxim=max(maxim,a[i][j]);
i=1;j=maxim;
while (i<=j){
mid=(i+j)/2;
st=dr=1;
k[st]=s;
v[s.x][s.y]=1;
while (st<=dr && !v[f.x][f.y]){
for (t=0;t<4;t++){
x=k[st].x+di[t];
y=k[st].y+dj[t];
if (x>0 && x<=n && y>0 && y<=m && a[x][y]>=mid && !v[x][y]){
v[x][y]=1;
k[++dr]=make_pair(x,y);
}
}
st++;
}
if (v[f.x][f.y]){
ok++;
i=mid+1;
}
else
j=mid-1;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
v[i][j]=0;
}
if (ok)
fout<<j-1;
else
fout<<"-1";
fin.close();
fout.close();
return 0;
}