Pagini recente » Cod sursa (job #1667118) | Cod sursa (job #2503333) | Cod sursa (job #2876895) | Cod sursa (job #1555179) | Cod sursa (job #2543954)
#include <fstream>
#include <queue>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
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()
{
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;
}