Pagini recente » Cod sursa (job #205059) | Cod sursa (job #1477882) | Cod sursa (job #693233) | Cod sursa (job #1922421) | Cod sursa (job #2981471)
#include <iostream>
#include <fstream>
#define nmx 1001
#include <queue>
using namespace std;
int ctd,n,m,v[nmx][nmx],vf[nmx][nmx],sx,sy,fx,fy,di[4]= {0,0,1,-1},dj[4]= {-1,1,0,0},dragon[nmx][nmx];
queue <pair<int,int>> myq;
char c;
void bfs()
{
while (myq.size())
{
int i1,j1;
i1=myq.front().first;
j1=myq.front().second;
myq.pop();
for (int i=0; i<=3; i++)
{
int i2,j2;
i2=i1+di[i];
j2=j1+dj[i];
if (i2>=1 && i2<=n && j2>=1 && j2<=m && dragon[i2][j2]==0 && v[i2][j2]==0)
{
dragon[i2][j2]=dragon[i1][j1]+1;
myq.push(make_pair(i2,j2));
}
}
}
}
void dfs (int li,int co,int dist)
{
vf[li][co]=1;
for (int i=0;i<=3;i++)
{
int ln=li+di[i];
int cn=co+dj[i];
if (ln>=1 && ln<=n && cn>=1 && cn<=m && vf[ln][cn]==0 && dragon[ln][cn]>=dist && v[ln][cn]==0)
dfs(ln,cn,dist);
}
}
bool verif (int dist)
{
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++)
vf[i][j]=0;
dfs(sx,sy,dist);
return vf[fx][fy];
}
int main()
{
ifstream f ("barbar.in");
ofstream g ("barbar.out");
f>>n>>m;
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++)
{
f>>c;
if (c=='D')
{
myq.push({i,j});
dragon[i][j]=1;
}
if (c=='I')
{
sx=i;
sy=j;
}
if (c=='O')
{
fx=i;
fy=j;
}
if (c=='*')
v[i][j]=1;
}
bfs();
int st=0,dr=n*m,mid,sol=-1;
while (st<=dr)
{
mid=(st+dr)/2;
bool test=verif(mid+1);
if (test==1)
{
sol=mid;
st=mid+1;
}
else dr=mid-1;
}
g<<sol;
}