Pagini recente » Cod sursa (job #2829343) | Cod sursa (job #2018837) | Cod sursa (job #2485117) | Cod sursa (job #1629150) | Cod sursa (job #1865981)
#include <cstdio>
#include <algorithm>
#include <bitset>
#define INF 2000000000
using namespace std;
int a[1001][1001],dd[1001][1001];
pair <int,int> l[1000001];
bitset <1001> f[1001];
int di[]={0,0,1,-1};
int dj[]={-1,1,0,0};
int verif (int mid,int n,int m){
int p,u,iv,jv,d;
p=u=1;
for (int i=1;i<=n;i++)
f[i].reset();
// if (mid==3)
// printf ("a");
while (p<=u){
for (d=0;d<4;d++){
iv=l[p].first+di[d];
jv=l[p].second+dj[d];
if (iv>0 && iv<=n && jv>0 && jv<=m && a[iv][jv]!=1 && f[iv][jv]==0){
f[iv][jv]=1;
if (a[iv][jv]==3)
return 1;
if (dd[iv][jv]>=mid){
l[++u].first=iv;
l[u].second=jv;
//if (mid==3)
// printf ("%d %d\n",iv,jv);
}
}
}
p++;
}
return 0;
}
int main()
{
FILE *fin=fopen ("barbar.in","r");
FILE *fout=fopen ("barbar.out","w");
int n,m,nrd,i,j,st,dr,mid,p,u,d,is,js,iv,jv;
char c;
fscanf (fin,"%d%d",&n,&m);
nrd=0;
for (i=1;i<=n;i++){
fgetc(fin);
for (j=1;j<=m;j++){
dd[i][j]=INF;
c=fgetc(fin);
if (c=='.')
a[i][j]=0;
else if (c=='*')
a[i][j]=1;
else if (c=='D'){
nrd++;
a[i][j]=2;
dd[i][j]=0;
l[nrd].first=i;
l[nrd].second=j;
}
else if (c=='I'){
is=i;
js=j;
}
else if (c=='O'){
a[i][j]=3;
}
}
}
p=1;
u=nrd;
while (p<=u){
for (d=0;d<4;d++){
iv=l[p].first+di[d];
jv=l[p].second+dj[d];
if (iv>0 && iv<=n && jv>0 && jv<=m && dd[iv][jv]==INF){
dd[iv][jv]=dd[l[p].first][l[p].second]+1;
l[++u].first=iv;
l[u].second=jv;
}
}
p++;
}
l[1].first=is;
l[1].second=js;
st=1;
dr=1001;
while (st<=dr){
mid=(st+dr)/2;
if (verif (mid,n,m)==1)
st=mid+1;
else dr=mid-1;
}
if (verif (0,n,m)==0)
st=0;
fprintf (fout,"%d",st-1);
return 0;
}