Pagini recente » Cod sursa (job #2293462) | Cod sursa (job #361620) | Cod sursa (job #2314187) | Cod sursa (job #1852461) | Cod sursa (job #2361979)
#include<bits/stdc++.h>
#define N 1010
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
int n,m,x0,y0,x2,y2;
char a[N][N];
int M[N][N], b[N][N];
queue<pii>Q;
bool OK(int i, int j) {
return (i>=1 && j>=1 && i<=n && j<=m);
}
int main() {
ifstream cin("barbar.in");
ofstream cout("barbar.out");
cin>>n>>m;
for (int i=1; i<=n; ++i) {
for (int j=1; j<=m; ++j) {
cin>>a[i][j];
if (a[i][j]=='I') x0=i,y0=j;
else if (a[i][j]=='O') x2=i, y2=j;
else if (a[i][j]=='D') Q.push({i,j});
}
}
while (Q.size()) {
int i=Q.front().fi;
int j=Q.front().se;
Q.pop();
for (int d=0; d<4; ++d) {
int i2=i+dx[d];
int j2=j+dy[d];
if (OK(i2,j2) && a[i2][j2]!='D' && a[i2][j2]!='*' && (!b[i2][j2] || b[i2][j2]>b[i][j]+1)) {
b[i2][j2]=b[i][j]+1;
Q.push({i2,j2});
}
}
}
Q.push({x0,y0}); M[x0][y0]=b[x0][y0];
while (Q.size()) {
int i=Q.front().fi;
int j=Q.front().se; Q.pop();
for (int d=0; d<4; ++d) {
int i2=i+dx[d];
int j2=j+dy[d];
if (OK(i2,j2) && a[i2][j2]!='D' && a[i2][j2]!='*' && (!M[i2][j2] || min(M[i][j], b[i2][j2])>M[i2][j2])) {
M[i2][j2]=min(M[i][j],b[i2][j2]);
Q.push({i2,j2});
}
}
} cout<<M[x2][y2];
return 0;
}