Pagini recente » Cod sursa (job #2155909) | Cod sursa (job #1253574) | Cod sursa (job #1645916) | Cod sursa (job #3338900) | Cod sursa (job #3338104)
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
const int NMAX=1000;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
queue<pair<int,int>>q;
char p[NMAX+2][NMAX+2];
int dist[NMAX+2][NMAX+2];
pair<int,int>aux,nou;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
bool viz[NMAX+2][NMAX+2];
int xs,ys,xd,yd;
bool valid(int dist_min)
{
int i,dir,found=0;
memset(viz,0,sizeof(viz));
while(!q.empty())
q.pop();
q.push({xs,ys});
viz[xs][ys]=1;
while(!q.empty()&&!found)
{
aux=q.front();
for(dir=0;dir<4;dir++)
{
nou.first=aux.first+dx[dir];
nou.second=aux.second+dy[dir];
if(dist[nou.first][nou.second]>=dist_min && !viz[nou.first][nou.second])
{
viz[nou.first][nou.second]=1;
q.push(nou);
if(nou.first==xd&&nou.second==yd)
found=1;
}
}
q.pop();
}
return found;
}
int main()
{
int i,j,r,c;
fin>>r>>c;
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
{
fin>>p[i][j];
if(p[i][j]=='I')
{
xs=i;
ys=j;
}
else if(p[i][j]=='O')
{
xd=i;
yd=j;
}
else if(p[i][j]=='D')
{
q.push({i,j});
viz[i][j]=1;
}
}
while(!q.empty())
{
aux=q.front();
for(int dir=0;dir<4;dir++)
{
nou.first=aux.first+dx[dir];
nou.second=aux.second+dy[dir];
if((p[nou.first][nou.second]=='.'||p[nou.first][nou.second]=='I'||p[nou.first][nou.second]=='O')&&!viz[nou.first][nou.second])
{
dist[nou.first][nou.second]=dist[aux.first][aux.second]+1;
viz[nou.first][nou.second]=1;
q.push(nou);
}
}
q.pop();
}
int last=0;
int st=1;
int dr=dist[xs][ys];
int mij;
while(st<=dr)
{
mij=(st+dr)/2;
if(valid(mij))
{
last=mij;
st=mij+1;
}
else
{
dr=mij-1;
}
}
fout<<last;
return 0;
}