Pagini recente » Monitorul de evaluare | Cod sursa (job #1947759) | Cod sursa (job #2029186) | Cod sursa (job #2261184) | Cod sursa (job #2158136)
#include <bits/stdc++.h>
using namespace std;
#define f first
#define s second
#define mp make_pair
int a[1010][1010],d[1010][1010],dx[]={0,1,0,-1},dy[]={1,0,-1,0};
queue<pair<int,int> >q;
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
int n,m,i,j,xo,yo,xd,yd,x,y;
char c;
scanf("%d%d\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;}
for (i=0;i<=m+1;i++) {a[0][i]=-1;a[n][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("%d",a[xd][yd]-1);
return 0;
}