Pagini recente » Cod sursa (job #2243131) | Cod sursa (job #2746453) | Cod sursa (job #1517501) | Cod sursa (job #813479) | Cod sursa (job #2191826)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int NMAX = 1005;
int dx[]={0,1,-1,0,0};
int dy[]={0,0,0,-1,1};
int v[NMAX][NMAX];
int n,m;
bool viz[NMAX][NMAX];
string s[NMAX];
pair<int,int> start,sfarsit;
queue <pair <int,int> > q;
bool drum(int val)
{
q.push(start);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
viz[i][j]=0;
while(!q.empty())
{
pair<int,int> aux=q.front();
q.pop();
for(int i=1;i<=4;i++)
{
int vx=aux.first+dx[i];
int vy=aux.second+dy[i];
if(s[vx][vy]='*' and v[vx][vy]>=val and viz[vx][vy]==0)
{
viz[vx][vy]=1;
q.push({vx,vy});
}
}
}
return viz[sfarsit.first][sfarsit.second];
}
int main()
{
fin >> n >> m;
s[0]=string(m+1,'*');
s[n+1]=string(m+1,'*');
for(int i=1;i<=n;i++)
{
fin >> s[i];
s[i]="*"+s[i]+"*";
for(int j=1;j<=m;j++)
{
if(s[i][j]=='D')
{
q.push({i,j});
v[i][j]=1;
}
if(s[i][j]=='I')
{
start={i,j};
}
if(s[i][j]=='O')
{
sfarsit={i,j};
}
}
}
while(!q.empty())
{
pair<int,int> aux=q.front();
q.pop();
for(int i=1;i<=4;i++)
{
int vx=aux.first+dx[i];
int vy=aux.second+dy[i];
if(s[vx][vy]!='*' and v[vx][vy]==0)
{
v[vx][vy]=v[aux.first][aux.second]+1;
q.push({vx,vy});
}
}
}
int st=2;
int sol=0;
int dr=n*m;
while(st<=dr)
{
int mij=(st+dr)/2;
if(drum(mij)==1)
{
st=mij+1;
sol=mij;
}
else dr=mij-1;
}
fout << sol-1;
return 0;
}