Pagini recente » Cod sursa (job #664061) | Cod sursa (job #1891422) | Cod sursa (job #3335139) | Cod sursa (job #3313794) | Cod sursa (job #3307082)
#include <fstream>
#include<queue>
using namespace std;
ifstream in("barbari.in");
ofstream out("barbari.out");
vector<pair<int,int>> dra;
vector<pair<int,int>> blocked;
int n,m,te1,te2,ie1,ie2;
bool lee1(int x,int y,int x2,int y2,bool blocke[][1001])
{
bool viz[1001][1001]= {0};
int dist[1001][1001]= {0};
queue<pair<int,int>> q;
q.push({x,y});
viz[x][y]=1;
while(!q.empty())
{
int x1=q.front().first;
int y1=q.front().second;
if(x1==x2 && y1==y2)
{
return true;
}
q.pop();
if(!blocke[x1+1][y1] && !viz[x1+1][y1] && x1 && y1 && x1<=n && y1<=m)
{
if(x1)
dist[x1+1][y1]=dist[x1][y1]+1;
q.push({x1+1,y1});
viz[x1+1][y1]=1;
}
if(!blocke[x1-1][y1] && !viz[x1-1][y1] && x1 && y1 && x1<=n && y1<=m)
{
dist[x1-1][y1]=dist[x1][y1]+1;
q.push({x1-1,y1});
viz[x1-1][y1]=1;
}
if(!blocke[x1][y1+1] && !viz[x1][y1+1] && x1 && y1 && x1<=n && y1<=m)
{
dist[x1][y1+1]=dist[x1][y1]+1;
q.push({x1,y1+1});
viz[x1][y1+1]=1;
}
if(!blocke[x1][y1-1] && !viz[x1][y1-1] && x1 && y1 && x1<=n && y1<=m)
{
dist[x1][y1-1]=dist[x1][y1]+1;
q.push({x1,y1-1});
viz[x1][y1-1]=1;
}
}
return false;
}
void lee2(vector<pair<int,int>> &dr,int d,bool block[][1001])
{
bool viz[1001][1001]= {0};
int dist[1001][1001]= {0};
queue<pair<int,int>> q;
for(int i=0; i<dr.size(); i++)
{
int x=dr[i].first;
int y=dr[i].second;
q.push({x,y});
viz[x][y]=1;
if(dist[x][y]==d)
{
block[x][y]=true;
}
}
while(!q.empty())
{
int x1=q.front().first;
int y1=q.front().second;
q.pop();
if(dist[x1][y1]<=d)
{
block[x1][y1]=true;
}
if(dist[x1][y1]<d)
{
if(!viz[x1+1][y1] && x1+1 && y1 && x1+1<=n && y1<=m)
{
dist[x1+1][y1]=dist[x1][y1]+1;
q.push({x1+1,y1});
viz[x1+1][y1]=1;
}
if(!viz[x1-1][y1] && x1-1 && y1 && x1-1<=n && y1<=m)
{
dist[x1-1][y1]=dist[x1][y1]+1;
q.push({x1-1,y1});
viz[x1-1][y1]=1;
}
if(!viz[x1][y1+1] && x1 && y1+1 && x1<=n && y1+1<=m)
{
dist[x1][y1+1]=dist[x1][y1]+1;
q.push({x1,y1+1});
viz[x1][y1+1]=1;
}
if(!viz[x1][y1-1] && x1 && y1-1 && x1<=n && y1-1<=m)
{
dist[x1][y1-1]=dist[x1][y1]+1;
q.push({x1,y1-1});
viz[x1][y1-1]=1;
}
}
}
}
bool nr(int w)
{
bool blocky[1001][1001]= {0};
for(int i=0; i<(int)blocked.size(); i++)
{
blocky[blocked[i].first][blocked[i].second]=true;
}
lee2(dra,w,blocky);
if(lee1(te1,te2,ie1,ie2,blocky))
{
return true;
}
return false;
}
int main()
{
in>>n>>m;
char a;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
in>>a;
if(a=='*')
{
blocked.push_back({i,j});
}
if(a=='D')
{
dra.push_back({i,j});
}
if(a=='I')
{
te1=i;
te2=j;
}
if(a=='O')
{
ie1=i;
ie2=j;
}
}
}
int l=0,r=1000;
int ans=0;
while(l<=r)
{
int mid=(r+1+l)/2;
if(nr(mid))
{
l=mid+1;
ans=mid;
}
else
{
r=mid-1;
}
}
out<<ans+1;
return 0;
}