Pagini recente » Cod sursa (job #3353857) | Cod sursa (job #262966) | Cod sursa (job #2181584) | Cod sursa (job #2481785) | Cod sursa (job #3327507)
#include <fstream>
#define N 1002
using namespace std;
struct aa
{
int l,c;
} q[N*N];
int n,m,d[N][N],d1[N][N],li,ci,lf,cf;
short int a[N][N];
int dx[]= {0, 1, 0, -1}, dy[]= {1, 0, -1, 0}; /// directii
char ch;
bool interior(int l, int c)
{
return l>=1 && l<=n && c>=1 && c<=m;
}
bool bfs(int dst)
{
int p=1,u=0;
if(d[li][ci] < dst)
return 0;
q[++u] = {li,ci};
d1[li][ci] = 1;
while(p<=u)
{
int l=q[p].l;
int c=q[p].c;
if(l==lf&&c==cf)
return 1;
for(int k=0; k<4; k++)
{
int lv=l+dx[k];
int cv=c+dy[k];
if(interior(lv,cv)&&a[lv][cv]==0&&d1[lv][cv]==0)
{
if(d[lv][cv]>=dst)
{
d1[lv][cv] = d1[l][c]+1;
q[++u] = {lv,cv};
}
}
}
p++;
}
return 0;
}
int main()
{
ifstream cin("barbar.in");
ofstream cout("barbar.out");
cin>>n>>m;
int p=1,u=0;
for(int i=1; i<=n; ++i)
for(int j=1; j<=m; ++j)
{
cin>>ch;
switch(ch)
{
case '.':
a[i][j] = 0;
break; /// liber
case '*':
a[i][j] =-1;
break; /// intrare
case 'I':
a[i][j] = 0;
li=i;
ci=j;
break; /// iesire
case 'O':
a[i][j] = 0;
lf=i;
cf=j;
break; /// dragon
case 'D':
a[i][j] = 0;
q[++u]= {i,j};
d[i][j]=1;
break;
}
}
while(p<=u)
{
int l=q[p].l;
int c=q[p].c;
for(int dir=0; dir<4; ++dir)
{
int lv=l+dx[dir];
int cv=c+dy[dir];
if(interior(lv,cv))
if(d[lv][cv]==0&&a[lv][cv]==0)
{
q[++u]= {lv,cv};
d[lv][cv]=d[l][c]+1;
}
}
p++;
}
int st=0, dr=n*m, ans=-1;
while(st<=dr)
{
int mij = (st+dr)/2;
if(bfs(mij))
{
ans=mij;
st=mij+1;
}
else dr=mij-1;
}
if(ans==-1)
cout<<-1;
else
cout<<ans-1;
return 0;
}