Pagini recente » Cod sursa (job #1947369) | Cod sursa (job #2891253) | Cod sursa (job #813348) | Cod sursa (job #559800) | Cod sursa (job #2362008)
#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,x11,y11,x2,y2;
char a[N][N];
int M[N][N], b[N][N];
bool u[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') x11=i,y11=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(); u[i][j]=0;
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;
if (!u[i2][j2]) Q.push({i2,j2}), u[i2][j2]=1;
}
}
}
int st=min(b[x11][y11],b[x2][y2]), dr=n*m;
while (st<=dr) {
int mid=(st+dr)/2;
Q.push({x11,y11}); M[x11][y11]=b[x11][y11];
while (Q.size()) {
int i=Q.front().fi;
int j=Q.front().se; Q.pop(); u[i][j]=0;
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] && b[i2][j2]>=mid) {
M[i2][j2]=1;
if (!u[i2][j2]) Q.push({i2,j2}), u[i2][j2]=1;
}
}
}
if (M[x2][y2]) st=mid+1;
else dr=mid-1;
for (int i=1; i<=n; ++i)
for (int j=1; j<=m; ++j) M[i][j]=0;
}
if (st>dr) cout<<st-1;
else cout<<"-1";
return 0;
}