Pagini recente » Cod sursa (job #2592473) | Cod sursa (job #2665760) | Cod sursa (job #1550716) | Cod sursa (job #1274293) | Cod sursa (job #2543960)
#include <bits/stdc++.h>
using namespace std;
int dx[4]= {0,0,1,-1};
int dy[4]= {1,-1,0,0};
int n,m,a[1005][1005],b[1005][1005],d[1005][1005],xi,yi,xf,yf;
queue <pair<int,int>> q;
void bordare(int n, int m)
{
for(int i=0; i<=n+1; ++i)
{
a[i][0]=a[i][m+1]=b[i][0]=b[i][m+1]=d[i][0]=d[i][m+1]=-1;
}
for(int i=0; i<=m+1; ++i)
{
a[0][i]=a[n+1][i]=b[0][i]=b[n+1][i]=d[0][i]=d[n+1][i]=-1;
}
}
void reset()
{
for(int i=0; i<=n+1; ++i)
{
///J
for(int j=0; j<=m+1; ++j)
{
a[i][j]=b[i][j];
}
}
}
void Fill(int i, int j, int dst)
{
a[i][j]=-1;
for(int p=0; p<4; p++)
{
int xx=i+dx[p];
int yy=j+dy[p];
if(!a[xx][yy] && d[xx][yy]-1>=dst)
{
Fill(xx,yy,dst);
}
}
}
void Lee()
{
while(!q.empty())
{
int x=q.front().first;
int y=q.front().second;
///O
q.pop();
for(int i=0; i<4; ++i)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(!d[xx][yy])
{
q.push({xx,yy});
d[xx][yy]=d[x][y]+1;
}
}
}
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
cin.sync_with_stdio(0);
cin.tie(0);
cin>>n>>m;
bordare(n,m);
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=m; ++j)
{
char ch;
cin>>ch;
///N
if(ch=='I')
{
xi=i;
yi=j;
}
else if(ch=='O')
{
xf=i;
yf=j;
}
else if(ch=='*')
{
a[i][j]=-1;
b[i][j]=-1;
d[i][j]=-1;
}
else if(ch=='D')
{
q.push({i,j});
d[i][j]=1;
}
}
}
Lee();
int st=0,dr=n+m;
int rez=0;
///E
bool ok=false;
while(st<=dr)
{
int mij=(st+dr)/2;
reset();
Fill(xi,yi,mij);
if(a[xf][yf]==0)
{
dr=mij-1;
}
else
{
ok=true;
rez=mij;
st=mij+1;
}
}
if(ok)
cout<<rez<<'\n';
else cout<<-1<<'\n';
///L
return 0;
}