Pagini recente » Cod sursa (job #213035) | Monitorul de evaluare | Cod sursa (job #1389930) | Cod sursa (job #2414568) | Cod sursa (job #2318980)
#include <fstream>
#include <cstring>
#define DIM 1010
#define x first
#define y second
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int r,c,i,j,a[DIM][DIM],istart,jstart,istop,jstop,iv,jv,k,st,dr,mid,d[DIM][DIM],ok,p,u,same;
int di[]={-1,1,0,0};
int dj[]={0,0,-1,1};
pair<int,int> v[DIM];
char ch[DIM][DIM];
int main() {
fin>>r>>c;
for (i=1;i<=r;i++)
for (j=1;j<=c;j++) {
fin>>ch[i][j];
if (ch[i][j]=='I') {
ch[i][j]='.';
istart=i;
jstart=j;
}
if (ch[i][j]=='O') {
ch[i][j]='.';
istop=i;
jstop=j;
}
if (ch[i][j]=='D') {
ch[i][j]='.';
a[i][j]=1;
u++;
v[u].x=i; v[u].y=j;
}
}
p = 1;
while (p <= u) {
for (int dir = 0; dir<=3; dir++) {
iv = v[p].x + di[dir];
jv = v[p].y + dj[dir];
if (iv >= 1 && iv <= r & jv >= 1 && jv <= c && ch[iv][jv] == '.' && a[iv][jv] == 0) {
u++;
v[u].x = iv;
v[u].y = jv;
a[iv][jv] = 1 + a[ v[p].x ][ v[p].y ];
}
}
p++;
}
if (a[istop][jstop]==0) {
fout<<-1;
return 0;
}
st=1, dr=a[v[u].x][v[u].y]; same=dr;
while (st<=dr) { //caut binar numai celule cu distanta pana la dragoni >=mid, de la istart,jstart la istop,jstop
mid=(st+dr)/2; ok=0;
if (a[istart][jstart]<mid)
ok=0;
else {
for (i=1;i<=r;i++)
for (j=1;j<=c;j++)
d[i][j]=0;
d[istart][jstart]=1;
v[1].x=istart; v[1].y=jstart;
p=u=1;
while (p<=u&&!ok) {
i=v[p].x; j=v[p].y;
for (int dir=0;dir<4;dir++) {
iv=i+di[dir];
jv=j+dj[dir];
if (iv>=1&&iv<=r&&jv>=1&&jv<=c&&a[iv][jv]>=mid&&d[iv][jv]==0) {
u++;
v[u].x=iv; v[u].y=jv;
d[iv][jv]=1;
if (iv==istop&&jv==jstop) {
ok=1; break;
}
}
}
p++;
}
}
if (ok)
st=mid+1;
else
dr=mid-1;
}
fout<<dr-1;
return 0;
}