Pagini recente » Cod sursa (job #800700) | Cod sursa (job #514992) | Cod sursa (job #2173908) | Cod sursa (job #1586213) | Cod sursa (job #2958649)
#include <fstream>
#include <cstring>
#define DIM 1001
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,p,u,x1,y1,x2,y2,st,dr,sol,a[DIM][DIM];
int di[]={-1,0,0,1},dj[]={0,-1,1,0};
bool viz[DIM][DIM];
char ch;
struct punct {
int x,y;
}q[DIM*DIM];
bool inauntru(int i,int j) {
return i>=1 && i<=n && j>=1 && j<=m;
}
int main() {
fin>>n>>m;
p=1;
u=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++) {
fin>>ch;
if (ch=='*')
a[i][j]=-1;
else
if (ch=='D') {
q[++u]={i,j};
a[i][j]=1;
}
else
if (ch=='I')
x1=i,y1=j;
else
if (ch=='O')
x2=i,y2=j;
}
while (p<=u) {
int i=q[p].x;
int j=q[p].y;
p++;
for (int d=0;d<4;d++) {
int ic=i+di[d];
int jc=j+dj[d];
if (inauntru(ic,jc) && a[ic][jc]==0) {
q[++u]={ic,jc};
a[ic][jc]=a[i][j]+1;
}
}
}
sol=-1;
st=1;
dr=n*m;
while (st<=dr) {
int mid=(st+dr)/2;
if (a[x1][y1]<mid) {
dr=mid-1;
continue;
}
memset(viz,0,sizeof(viz));
p=u=1;
q[1]={x1,y1};
viz[x1][y1]=1;
while (p<=u) {
int i=q[p].x;
int j=q[p].y;
p++;
for (int d=0;d<4;d++) {
int ic=i+di[d];
int jc=j+dj[d];
if (inauntru(ic,jc) && a[ic][jc]>=mid && viz[ic][jc]==0) {
q[++u]={ic,jc};
viz[ic][jc]=1;
}
}
}
if (viz[x2][y2]==1) {
st=mid+1;
sol=mid-1;
}
else
dr=mid-1;
}
fout<<sol;
return 0;
}