Pagini recente » Cod sursa (job #1306872) | Cod sursa (job #1763382) | Cod sursa (job #2240925) | Cod sursa (job #1677870) | Cod sursa (job #2636074)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int lee[1002][1002];
short vizitat[1002][1002];
char c;
int n,m,si,sj,fi,fj;
queue<pair<int,int> > q;
queue<pair<int,int> > dragon;
int xi[4]={0,-1,0,1};
int xj[4]={1,0,-1,0};
int res=-1;
bool ok(int i, int j)
{
if(1<=i && i<=n && 1<=j && j<=m && lee[i][j]!=-2)
return true;
else
return false;
}
void dr(int i,int j)
{
q.push({i,j});
while(!q.empty())
{
int x=q.front().first;
int y=q.front().second;
q.pop();
for(int p=0; p<4; p++)
{
int pi=x+xi[p];
int pj=y+xj[p];
if(ok(pi,pj) && (lee[pi][pj]>lee[x][y]+1 || lee[pi][pj]==-1))
{
lee[pi][pj]=lee[x][y]+1;
q.push({pi,pj});
}
}
}
}
bool verific(int val)
{
while(!q.empty())
{
q.pop();
}
memset(vizitat,0,sizeof vizitat);
vizitat[si][sj]=1;
if(lee[si][sj]>=val) q.push({si,sj});
else return false;
while(!q.empty())
{
int x=q.front().first;
int y=q.front().second;
q.pop();
for(int p=0; p<4; p++)
{
int pi=x+xi[p];
int pj=y+xj[p];
if(ok(pi,pj) && (vizitat[pi][pj]>vizitat[x][y]+1 || vizitat[pi][pj]==0) && lee[pi][pj]>=val)
{
if(pi==fi && pj==fj)
{
return true;
}
vizitat[pi][pj]=vizitat[x][y]+1;
q.push({pi,pj});
}
}
}
return false;
}
inline void cauta()
{
int dr=n*m;
int st=0;
int mij=0;
while(st<=dr)
{
mij=(st+dr)/2;
if(verific(mij))
{
res=mij;
st=mij+1;
}
else dr=mij-1;
}
}
int main()
{
fin>>n>>m;
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=m; j++)
{
fin>>c;
if(c=='.') lee[i][j]=-1;
else if(c=='*') lee[i][j]=-2;
else if(c=='D')
{
lee[i][j]=0;
dragon.push({i,j});
}
else if(c=='I')
{
si=i;
sj=j;
lee[i][j]=-1;
}
else if(c=='O')
{
fi=i;
fj=j;
lee[i][j]=-1;
}
}
}
while(!dragon.empty())
{
while(!q.empty()) q.pop();
dr(dragon.front().first, dragon.front().second);
dragon.pop();
}
cauta();
fout<<res;
return 0;
}