Pagini recente » Cod sursa (job #1961929) | Cod sursa (job #1410132) | Cod sursa (job #2010329) | Cod sursa (job #2255134) | Cod sursa (job #2158300)
#include <bits/stdc++.h>
using namespace std;
#define f first
#define s second
#define mp make_pair
#define ll long long
ll a[1010][1010],d[1010][1010],dx[]={0,1,0,-1},dy[]={1,0,-1,0};
queue<pair<ll,ll> >q;
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
ll n,m,i,j,xo,yo,xd,yd,x,y;
char c;
scanf("%lld%lld\n",&n,&m);
for (i=1;i<=n;i++){
for (j=1;j<=m;j++){
scanf("%c",&c);
if (c=='I') {xo=i;yo=j;}
if (c=='*') a[i][j]=-1;
if (c=='O') {xd=i;yd=j;}
if (c=='D') {q.push(mp(i,j));d[i][j]=1;}
}
scanf("\n");
}
for (i=0;i<=n+1;i++) {a[i][0]=-1;a[i][m+1]=-1;}
for (i=0;i<=m+1;i++) {a[0][i]=-1;a[n+1][i]=-1;}
while (!q.empty()){
x=q.front().f;
y=q.front().s;
q.pop();
for (i=0;i<4;i++){
if (a[x+dx[i]][y+dy[i]]!=-1&&d[x+dx[i]][y+dy[i]]==0){
d[x+dx[i]][y+dy[i]]=d[x][y]+1;
q.push(mp(x+dx[i],y+dy[i]));
}
}
}
q.push(mp(xo,yo));
a[xo][yo]=d[xo][yo];
while (!q.empty()){
x=q.front().f;
y=q.front().s;
q.pop();
for (i=0;i<4;i++){
if (a[x+dx[i]][y+dy[i]]!=-1&&a[x+dx[i]][y+dy[i]]<min(d[x+dx[i]][y+dy[i]],a[x][y])){
a[x+dx[i]][y+dy[i]]=min(d[x+dx[i]][y+dy[i]],a[x][y]);
q.push(mp(x+dx[i],y+dy[i]));
}
}
}
printf("%lld",a[xd][yd]-1);
return 0;
}