Pagini recente » Cod sursa (job #1011414) | Cod sursa (job #2155341) | Cod sursa (job #2806225) | Cod sursa (job #2065643) | Cod sursa (job #387892)
Cod sursa(job #387892)
#include<cstdio>
#define N 1003
bool viz[N][N],a[N][N];
char s[N];
int dist[N][N],coada[N*N][2],x0,y0,x1,y1,p,u,maxx,n,m;
const int dx[]={0,0,1,-1};
const int dy[]={-1,1,0,0};
#define maxim(a,b) ((a>b)?(a):(b))
void citire()
{
scanf("%d%d\n",&n,&m);
for (int i=1; i<=n; ++i)
{
fgets(s,m+2, stdin);
for (int j=0; j<m; ++j)
if (s[j]=='.')//pot trece doar prin 1
a[i][j+1]=true;
else
if (s[j]=='D')
{
coada[u][0]=i;
coada[u++][1]=j+1;
}
else
if (s[j]=='I')
{
x0=i;
y0=j+1;
//viz[x0][y0]=true;
a[i][j+1]=true;
}
else
if (s[j]=='O')
{
x1=i;
y1=j+1;
a[x1][y1]=true;
}
}
}
void bfs()
{
int x[2],y[2];
p=0;
while (u!=p)
{
x[0]=coada[p][0];
x[1]=coada[p++][1];
for (int i=0; i<4; ++i)
{
y[0]=x[0]+dx[i];
y[1]=x[1]+dy[i];
if (a[y[0]][y[1]]&&!viz[y[0]][y[1]])
{
coada[u][0]=y[0];
coada[u++][1]=y[1];
dist[y[0]][y[1]]=1+dist[x[0]][x[1]];
maxx=maxim(maxx,dist[y[0]][y[1]]);
viz[y[0]][y[1]]=true;
}
}
}
}
bool verific(int m)
{
p=0; u=0;
int x[2],y[2];
coada[u][0]=x0;
coada[u++][1]=y0;
viz[x0][y0]=true;
while (u!=p)
{
x[0]=coada[p][0];
x[1]=coada[p++][1];
for (int i=0; i<4; ++i)
{
y[0]=x[0]+dx[i];
y[1]=x[1]+dy[i];
if (a[y[0]][y[1]]&&!viz[y[0]][y[1]]&&dist[y[0]][y[1]]>=m)
{
coada[u][0]=y[0];
coada[u++][1]=y[1];
viz[y[0]][y[1]]=true;
}
}
}
if (viz[x1][y1])
return true;
return false;
}
void refac()
{
for (int i=1; i<=n; ++i)
for (int j=1; j<=m; ++j)
viz[i][j]=false;
}
int caut()
{
int i;
refac();
int pas=1<<20;
for (i=0 ; pas ; pas>>=1)
{
if(verific(i+pas))
i += pas;
refac();
}
if (i)
return i;
return -1;
}
void afis(int d[N][N])
{
for (int i=1;i<=n; ++i)
{
for(int j=1; j<=m; ++j)
printf("%d ",d[i][j]);
printf("\n");
}
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
citire();
bfs();
//afis(dist);
printf("%d\n",caut());
return 0;
}