Pagini recente » Cod sursa (job #2435296) | Cod sursa (job #1910870) | Cod sursa (job #2956190) | Cod sursa (job #1611996) | Cod sursa (job #1607482)
#include <fstream>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
struct coada
{
int x,y;
}c[1000*1000+5];
int n,m,xi,yi,u,xf,yf,ma[1003][1003],vx[4]={1,0,-1,0},vy[4]={0,1,0,-1},dmax;
bool viz[1003][1003];
char ch;
void citire()
{
int i,j;
fin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
fin>>ch;
if(ch=='I')
{
xi=i;
yi=j;
}
if(ch=='D')
{
ma[i][j]=-1;
u++;
c[u].x=i;
c[u].y=j;
}
if(ch=='*')
ma[i][j]=-1;
if(ch=='O')
{
xf=i;
yf=j;
}
}
for(i=0;i<=n+1;i++)
ma[i][0]=ma[i][m+1]=-1;
for(i=0;i<=m+1;i++)
ma[0][i]=ma[n+1][i]=-1;
}
void lee()
{
int p=0,i;
coada aux;
while(p<u)
{
aux=c[++p];
for(i=0;i<4;i++)
{
aux.x=aux.x+vx[i];
aux.y=aux.y+vy[i];
if(ma[aux.x][aux.y]!=-1)
if(ma[aux.x][aux.y]==0 || ma[aux.x][aux.y]>ma[c[p].x][c[p].y]+1)
{
if(ma[c[p].x][c[p].y]==-1)
ma[aux.x][aux.y]=1;
else
ma[aux.x][aux.y]=ma[c[p].x][c[p].y]+1;
dmax=max(dmax,ma[aux.x][aux.y]);
u++;
c[u].x=aux.x;
c[u].y=aux.y;
}
aux=c[p];
}
}
}
int cautare(int x)
{
int p,u,i;
p=u=0;
coada aux;
if(ma[xi][yi]>=x)
{
u++;
c[u].x=xi;
c[u].y=yi;
viz[xi][yi]=1;
}
while(p<u)
{
aux=c[++p];
if(aux.x==xf && aux.y==yf)
return 1;
for(i=0;i<4;i++)
{
aux.x=aux.x+vx[i];
aux.y=aux.y+vy[i];
if(ma[aux.x][aux.y]>=x && viz[aux.x][aux.y]==0)
{
u++;
c[u].x=aux.x;
c[u].y=aux.y;
viz[aux.x][aux.y]=1;
}
aux=c[p];
}
}
return 0;
}
void init()
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
viz[i][j]=0;
}
void rezolvare()
{
int ls,ld,mij;
ls=1;
ld=dmax;
while(ls<=ld)
{
mij=(ls+ld)/2;
if(cautare(mij))
ls=mij+1;
else
ld=mij-1;
init();
}
fout<<ld;
}
int main()
{
citire();
lee();
rezolvare();
fout.close();
return 0;
}