Pagini recente » Cod sursa (job #1899712) | Cod sursa (job #2237264) | Cod sursa (job #1821133) | Cod sursa (job #686739) | Cod sursa (job #2334274)
#include <fstream>
#include <cstring>
using namespace std;
int n, m, i, j, st, dr, x1, y1, x2, y2, st1, dr1, sol, ok;
int a[1001][1001], d[1001][1001], b[1001][1001];
int dx[] = {0, 0, 1, 0, -1};
int dy[] = {0, 1, 0, -1, 0};
struct codau {
int l, c;
}q[1000000];
char car;
int main () {
ifstream fin ("barbar.in");
ofstream fout ("barbar.out");
fin>>n>>m;
for (i=1;i<=n;i++) {
for (j=1;j<=m;j++) {
fin>>car;
if (car=='*') {
a[i][j]=-1;
}
if (car=='I') {
a[i][j]=1;
x1=i;
y1=j;
}
if (car=='O') {
a[i][j]=2;
x2=i;
y2=j;
}
if (car=='D') {
a[i][j]=3;
}
}
}
/*
for (i=1;i<=n;i++) {
for (j=1;j<=m;j++)
fout<<a[i][j]<<" ";
fout<<"\n";
}*/
st=1; dr=0;
for (i=1;i<=n;i++) {
for (j=1;j<=m;j++) {
if (a[i][j]==3) {
q[++dr].l=i;
q[dr].c=j;
d[i][j]=1;
}
}
}
while (st<=dr) {
int l=q[st].l;
int c=q[st].c;
for (i=1;i<=4;i++) {
int ln=l+dx[i];
int cn=c+dy[i];
if (ln>=1 && ln<=n && cn>=1 && cn<=m)
if ((a[ln][cn]==0 || a[ln][cn]==2 || a[ln][cn]==1) && d[ln][cn]==0) {
q[++dr].l=ln;
q[dr].c=cn;
d[ln][cn]=d[l][c]+1;
}
}
st++;
}
st=1;
dr=2000;
while (st<=dr) {
int mid = (st+dr)/2;
ok=1;
memset (b, 0, sizeof(b));
st1=1;
dr1=1;
q[st1].l=x1;
q[st1].c=y1;
if (d[x1][y1]<mid) {
ok=0;
}
b[x1][y1]=1;
while (st1<=dr1) {
int l=q[st1].l;
int c=q[st1].c;
for (i=1;i<=4;i++) {
int ln=l+dx[i];
int cn=c+dy[i];
if (ln>=1 && ln<=n && cn>=1 && cn<=m)
if (a[ln][cn]==0 && b[ln][cn]==0) {
if (d[ln][cn]>=mid) {
q[++dr1].l=ln;
q[dr1].c=cn;
b[ln][cn]=1;
} else
ok=0;
}
}
st1++;
}
if (ok==1) {
sol=mid;
st=mid+1;
}else
dr=mid-1;
}
fout<<sol;
return 0;
}