Pagini recente » Cod sursa (job #176607) | Cod sursa (job #2003103) | Cod sursa (job #2293743) | Cod sursa (job #513634) | Cod sursa (job #2320568)
#include <fstream>
#include <cstring>
#define DIM 1010
#define x first
#define y second
using namespace std;
ifstream fin ("barbar.in");
ofstream fout("barbar.out");
pair<int,int> v[DIM*DIM];
char ch[DIM][DIM];
int a[DIM][DIM],d[DIM][DIM];
int p,u,istart,jstart,istop,jstop,n,m,i,j,iv,jv,dir,st,dr,mid,ok;
int di[]={-1,1,0,0};
int dj[]={0,0,-1,1};
int main () {
fin>>n>>m;
for (i=1;i<=n;i++) {
for (j=1;j<=m;j++) {
fin>>ch[i][j];
if (ch[i][j]=='I') {
istart=i;
jstart=j;
ch[i][j]='.';
}
if (ch[i][j]=='O') {
istop=i;
jstop=j;
ch[i][j]='.';
}
if (ch[i][j]=='D') {
u++;
v[u].x=i;
v[u].y=j;
a[i][j]=1;
ch[i][j]='.';
}
}
}
p=1;
while (p<=u) {
for (dir=0;dir<=3;dir++) {
iv=v[p].x+di[dir];
jv=v[p].y+dj[dir];
if (iv>=1&&iv<=n&&jv>=1&&jv<=m&&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++;
}
st=1, dr=a[v[u].x][v[u].y];
while (st<=dr) {
mid=(st+dr)/2;
ok=0;
if (a[istart][jstart]<mid)
ok=0;
else {
memset(d,0,sizeof(d));
p=u=1;
d[istart][jstart]=1;
v[1].x=istart;
v[1].y=jstart;
while (p<=u&&ok==0) {
for (dir=0;dir<=3;dir++) {
iv=v[p].x+di[dir];
jv=v[p].y+dj[dir];
if (iv>=1&&iv<=n&&jv>=1&&jv<=m&&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==1)
st=mid+1;
else
dr=mid-1;
}
fout<<dr-1;
return 0;
}