Pagini recente » Cod sursa (job #2590100) | Cod sursa (job #2734212) | Cod sursa (job #2173120) | Cod sursa (job #2728213) | Cod sursa (job #1312172)
#include<cstdio>
#include<queue>
FILE* in=fopen("barbar.in","r");
FILE* out=fopen("barbar.out","w");
const int Q=1007;
int l,c;
bool d[Q][Q];
struct point{
int a,b;
};
std::queue<point> q;
const int dx[]={0,1,0,-1,0};
const int dy[]={0,0,1,0,-1};
int sx,sy,fx,fy;
int v[Q][Q];
int viz[Q][Q];
bool ver(int x)
{
while(!q.empty())
q.pop();
q.push(point{sx,sy});
if(v[sx][sy]<x)
return 0;
point act;
while(!q.empty())
{
act=q.front();
q.pop();
for(int j=1; j<=4; j++)
{
if(d[act.a+dx[j]][act.b+dy[j]]!=1 && v[act.a+dx[j]][act.b+dy[j]]>=x && viz[act.a+dx[j]][act.b+dy[j]]!=x)
{
if(act.a+dx[j]==fx && act.b+dy[j]==fy)
{
return 1;
}
viz[act.a+dx[j]][act.b+dy[j]]=x;
q.push(point{act.a+dx[j],act.b+dy[j]});
}
}
}
return 0;
}
char g[Q][Q];
void make()
{
int nr;
int pas=0;
point act;
while(!q.empty())
{
nr=q.size();
pas++;
for(int i=1; i<=nr; i++)
{
act=q.front();
q.pop();
for(int j=1; j<=4; j++)
{
if(d[act.a+dx[j]][act.b+dy[j]]!=1 && v[act.a+dx[j]][act.b+dy[j]]==0)
{
v[act.a+dx[j]][act.b+dy[j]]=pas+1;
q.push(point{act.a+dx[j],act.b+dy[j]});
}
}
}
}
}
int main()
{
fscanf(in,"%d %d\n",&l,&c);
char h;
for(int i=1; i<=l; i++)
{
d[i][0]=1;
d[i][c+1]=1;
}
for(int j=1; j<=c; j++)
{
d[0][j]=1;
d[l+1][j]=1;
}
for(int i=1; i<=l; i++)
fgets(g[i]+1,Q,in);
for(int i=1; i<=l; i++)
{
for(int j=1; j<=c; j++)
{
h=g[i][j];
if(h=='*')
d[i][j]=1;
if(h=='D')
{
q.push(point{i,j});
v[i][j]=1;
}
if(h=='I')
{
sx=i;
sy=j;
}
if(h=='O')
{
fx=i;
fy=j;
}
}
fscanf(in,"\n");
}
make();
int p=1024;
int k=0;
bool minus=0;
while(p)
{
if(ver(p+k)==1)
{
k+=p;
minus=1;
}
p/=2;
}
if(!minus)
fprintf(out,"-1");
else
fprintf(out,"%d",k-1);
return 0;
}