Pagini recente » Cod sursa (job #1301436) | Cod sursa (job #1732268) | Cod sursa (job #1170189) | Cod sursa (job #1848845) | Cod sursa (job #1540994)
#include <fstream>
#include<string.h>
#define DIM 1005
using namespace std;
ifstream fin ("barbar.in");
ofstream fout ("barbar.out");
int R,C,a[DIM][DIM],q[2][DIM*DIM],FL,FC,PL,PC,cont,dMax;
const int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
bool viz[DIM][DIM];
void read()
{
fin>>R>>C;
int i,j;
char x;
for(i=1;i<=R;i++)
{
for(j=1;j<=C;j++)
{
fin>>x;
if(x=='.')
{
a[i][j]=0;
continue;
}
if(x=='*')
{
a[i][j]=-1;
viz[i][j]=1;
continue;
}
if(x=='D')
{
a[i][j]=0;
viz[i][j]=1;
q[0][++cont]=i;
q[1][cont]=j;
continue;
}
if(x=='I')
{
PL=i;
PC=j;
continue;
}
if(x=='O')
{
FL=i;
FC=j;
continue;
}
}
}
}
bool inside_mat(int l,int c)
{
return l>0&&c>0&&l<=R&&c<=C;
}
void Fill()
{
int p=1,u=cont,x,y,l,c,i;
while(p<=u)
{
x=q[0][p];
y=q[1][p];
viz[x][y]=1;
for(i=0;i<4;i++)
{
l=x+dx[i];
c=y+dy[i];
if(a[l][c]!=-1&&inside_mat(l,c)&&viz[l][c]==0)
{
q[0][++u]=l;
q[1][u]=c;
a[l][c]=a[x][y]+1;
viz[l][c]=1;
dMax=max(dMax,a[l][c]);
}
}
p++;
}
}
int verif(int val)
{
int p,u,x,y,l,c,i;
memset(viz,0,sizeof(viz));
p=u=1;
q[0][p]=PL;
q[1][p]=PC;
while(p<=u)
{
x=q[0][p];
y=q[1][p];
for(i=0;i<4;i++)
{
l=x+dx[i];
c=y+dy[i];
if(a[l][c]>=val && viz[l][c]==0)
{
q[0][++u]=l;
q[1][u]=c;
viz[l][c]=1;
}
}
p++;
}
return viz[FL][FC];
}
void solve()
{
int st=1,dr=dMax,mij;
while(st<=dr)
{
mij=((st+dr)>>1);
if(verif(mij))
st=mij+1;
else
dr=mij-1;
}
fout<<st-1;
}
int main()
{
read();
Fill();
solve();
return 0;
}