Pagini recente » Cod sursa (job #1463465) | Cod sursa (job #1017287) | Cod sursa (job #390702) | Cod sursa (job #2838465) | Cod sursa (job #2979130)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int cst=1005;
int n,m;
int li,ci,lf,cf;
int mat[cst][cst],dragoni[cst][cst],dinamica[cst][cst],viz[cst][cst];
queue<pair<int,int>>q;
pair<int,int> dir[4]= {{-1,0}, {0,1}, {1,0}, {0,-1}};
void bfs()
{
while(q.size())
{
int ii1,ci1;
tie(ii1,ci1)=q.front();
q.pop();
for(int i=0; i<4; i++)
{
int if1,cf1;
if1=ii1+dir[i].first;
cf1=ci1+dir[i].second;
if(if1>=1&&if1<=n&&cf1>=1&&cf1<=m&&!mat[if1][cf1]&&!dragoni[if1][cf1])
{
dragoni[if1][cf1]=dragoni[ii1][ci1]+1;
q.push({if1,cf1});
}
}
}
}
void dfs(int la,int ca,int dist)
{
viz[la][ca]=1;
for(int i=0; i<4; i++)
{
int ln,cn;
ln=la+dir[i].first;
cn=ca+dir[i].second;
if(!mat[ln][cn]&&dragoni[ln][cn]>=dist&&!viz[ln][cn])
dfs(ln,cn,dist);
}
}
int ver(int dist)
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
viz[i][j]=0;
}
}
dfs(li,ci,dist);
return viz[lf][cf];
}
int main()
{
fin>>n>>m;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
char ch;
fin>>ch;
if(ch=='D')
{
q.push({i,j});
dragoni[i][j]=1;
}
if(ch=='*')
mat[i][j]=1;
if(ch=='I')
{
li=i;
ci=j;
}
if(ch=='O')
{
lf=i;
cf=j;
}
dinamica[i][j]=-1;
}
}
bfs();
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
dragoni[i][j]--;
}
}
int i1=1,i2=n+m+1,mij,rez=-1;
while(i1<=i2)
{
mij=(i1+i2)/2;
int ok=ver(mij);
if(ok==1)
{
rez=mij;
i1=mij+1;
}
else i2=mij-1;
}
fout<<rez;
return 0;
}