Pagini recente » Monitorul de evaluare | Cod sursa (job #1192953) | Profil RoCata1998 | Cod sursa (job #1836617) | Cod sursa (job #2961938)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
struct coada{
int l, c;
}q[1000001];
int viz[1001][1001], c[1001][1001];
int dx[]={1, -1, 0, 0}, dy[]={0, 0, -1, 1};
int n, m, xs, ys, xd, yd;
int interior(int x, int y)
{
if(x>=1&&x<=n&&y>=1&&y<=m)
{
return 1;
}
return 0;
}
int bfs(int mid)
{
int p, u, i;
p=u=1;
q[u]={xs,ys};
if(viz[q[u].l][q[u].c]<mid)
{
return 0;
}
c[q[u].l][q[u].c]=1;
int lc, cc, lv, cv;
while(p<=u&&c[xd][yd]==0)
{
lc=q[p].l;
cc=q[p].c;
p++;
for(i=0;i<=3;i++)
{
lv=lc+dx[i];
cv=cc+dy[i];
if(interior(lc, cv)==1&&viz[lv][cv]>=mid&&c[lv][cv]==0)
{
u++;
q[u]={lv, cv};
c[lv][cv]=1;
}
}
}
if(c[xd][yd]==0)
{
return 0;
}
else
{
return 1;
}
}
int main()
{
int i, j, sol;
char x;
fin>>n>>m;
int p=1, u=1;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
fin>>x;
if(x=='.')
{
viz[i][j]=0;
}
else
if(x=='I')
{
xs=i;
ys=j;
viz[i][j]=0;
}
else
if(x=='D')
{
viz[i][j]=-1;
u++;
q[u]={i,j};
}
else
if(x=='*')
{
viz[i][j]=-1;
}
else
{
viz[i][j]=0;
xd=i;
yd=j;
}
}
}
int lc, cc, lv, cv;
while(p<=u)
{
lc=q[p].l;
cc=q[p].c;
p++;
for(i=0;i<=3;i++)
{
lv=lc+dx[i];
cv=cc+dy[i];
if(interior(lv, cv)==1&&viz[lv][cv]==0)
{
if(viz[lc][cc]>0)
{
viz[lv][cv]=1+viz[lc][cc];
}
else
{
viz[lv][cv]=1+(-viz[lc][cc]);
}
u++;
q[u]={lv, cv};
}
}
}
p=u=1;
q[u]={xs, ys};
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(viz[i][j]>=0)
{
viz[i][j]-=1;
}
}
}
while(p<=u&&c[xd][yd]==0)
{
lc=q[p].l;
cc=q[p].c;
p++;
for(i=0;i<=3;i++)
{
lv=lc+dx[i];
cv=cc+dy[i];
if(interior(lv, cv)==1&&viz[lv][cv]!=-1&&c[lv][cv]==0)
{
c[lv][cv]=c[lc][cc]+1;
u++;
q[u]={lv, cv};
}
}
}
if(c[xd][yd]==0)
{
fout<<-1;
}
else
{
int st=1;
int dr=max(n, m);
while(st<=dr)
{
memset(c, 0, sizeof(c));
int mid=(st+dr)/2;
if(bfs(mid)==1)
{
sol=mid;
st=mid+1;
}
else
{
dr=mid-1;
}
}
}
fout<<sol;
}