Pagini recente » Cod sursa (job #2317856) | Cod sursa (job #1051380) | Cod sursa (job #2643745) | Cod sursa (job #2171933) | Cod sursa (job #1954307)
#include <fstream>
#include <cstring>
using namespace std;
char a[1001][1001],ss[1001];
bool b[1001][1001];
int nn[1001][1001],s[1001][1001],v[1001][1001],e[1001][1001],col[1000*1000+1],lin[1000*1000+1];
int dlin[4]={-1,0,1,0};
int dcol[4]={0,1,0,-1};
int main()
{ int n,m,i,j,st,dr,mij,dist=0,l1,c1,lun,l,p,l2,c2;
bool ok,zid;
ifstream f("barbar.in");
ofstream g("barbar.out");
f>>n>>m;
f.get();
for (i=1;i<=n;++i) {
f.get(ss,1001);
f.get();
ok=zid=0;
for (j=1;j<=m;++j) {
a[i][j]=ss[j-1];
if (a[i][j]=='I') {
l1=i;
c1=j;
}
if (a[i][j]=='O') {
l2=i;
c2=j;
}
if (a[i][j]=='D') {
ok=1;
zid=0;
}
if ((a[i][j]=='.' || a[i][j]=='I') && ok) v[i][j]=v[i][j-1]+1;
else if (a[i][j]=='*') {
zid=1;
ok=0;
}
}
}
for (i=1;i<=n;++i) {
ok=0;
zid=0;
for (j=m;j>=1;--j) {
if (a[i][j]=='D') {
ok=1;
zid=0;
}
if ((a[i][j]=='.' || a[i][j]=='I') && ok) e[i][j]=e[i][j+1]+1;
else if (a[i][j]=='*') {
zid=1;
ok=0;
}
}}
for (j=1;j<=m;++j) {
ok=0;
zid=0;
for (i=1;i<=n;++i) {
if (a[i][j]=='D') {
ok=1;
zid=0;
}
if ((a[i][j]=='.' || a[i][j]=='I') && ok) nn[i][j]=nn[i-1][j]+1;
else if (a[i][j]=='*') {
zid=1;
ok=0;
}
}}
for (j=1;j<=m;++j) {
ok=0;
zid=0;
for (i=n;i>=1;--i) {
if (a[i][j]=='D') {
ok=1;
zid=0;
}
if ((a[i][j]=='.' || a[i][j]=='I') && ok) s[i][j]=s[i+1][j]+1;
else if (a[i][j]=='*') {
zid=1;
ok=0;
}
}}
st=1;
dr=1000;
while (st<=dr) {
mij=(st+dr)/2;
lun=l=1;
lin[lun]=l1;
col[lun]=c1;
while (lun<=l) {
for (p=0;p<4;++p) {
i=lin[lun]+dlin[p];
j=col[lun]+dcol[p];
if (b[i][j]==0 && i>=1 && i<=n && j>=1 && j<=m)
if ((nn[i][j]>=mij || nn[i][j]==0) && (s[i][j]>=mij || s[i][j]==0) && (e[i][j]>=mij || e[i][j]==0) && (v[i][j]>=mij || v[i][j]==0)) {
++l;
lin[l]=i;
col[l]=j;
b[i][j]=1;
if (i==l2 && j==c2) break;
}
}
++lun;
}
if (b[l2][c2]==1) {
dist=mij;
st=mij+1;
}
else dr=mij-1;
for (i=1;i<=n;++i)
for (j=1;j<=m;++j)
b[i][j]=0;
}
g<<dist<<"\n";
return 0;
}