Pagini recente » Cod sursa (job #615943) | Cod sursa (job #1446549) | Rating Chiriac Crina (luvnoth) | Cod sursa (job #2083189) | Cod sursa (job #974580)
Cod sursa(job #974580)
#include<fstream>
#include<cstring>
#include<queue>
#include<vector>
#define N 1010
#define NM 1000020
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int dx[]={0,1,-1,0,0};
int dy[]={0,0,0,1,-1};
queue<int> qx,qy,Q;
int dr,st,e[N][N],i,t,dest,d,sol,nod,j,n,m,mij,E[NM],dsol,xi,yi,xf,yf,yc,xc,x,y,c[N][N];
vector<int> v[NM];
bool viz[NM];
char ch;
void prec()
{
while(!qx.empty())
{
x=qx.front();y=qy.front();
qx.pop();qy.pop();
for(i=1;i<=4;++i)
{
xc=x+dx[i];
yc=y+dy[i];
if(xc<1||yc<1||xc>n||yc>m||e[xc][yc]||c[xc][yc])
continue;
e[xc][yc]=e[x][y]+1;
qx.push(xc); qy.push(yc);
}
}
}
void init()
{
++t;
c[xi][yi]=t;
qx.push(xi);
qy.push(yi);
E[t]=e[xi][yi];
while(!qx.empty())
{
x=qx.front();y=qy.front();
if(c[x][y]==14)
{
x++;
x--;
}
qx.pop();qy.pop();
for(i=1;i<=4;++i)
{
xc=x+dx[i];yc=y+dy[i];
if(xc<1||yc<1||xc>n||yc>m)
continue;
if(!c[xc][yc])
{
c[xc][yc]=++t;
if(xc==xf&&yc==yf)
dest=t;
E[t]=e[xc][yc];
qx.push(xc);
qy.push(yc);
}
v[c[x][y]].push_back(c[xc][yc]);
}
}
}
int bfs(int mid)
{
for(i=1;i<=t;++i)
viz[i]=0;
Q.push(1);
viz[1]=1;
while(!Q.empty())
{
nod=Q.front();
Q.pop();
if(nod==dest)
{
while(!Q.empty())
Q.pop();
return 1;
}
for(i=0;i<v[nod].size();++i)
{
d=v[nod][i];
if(!viz[d]&&E[d]>=mid)
{
Q.push(d);
viz[d]=1;
}
}
}
return 0;
}
int main()
{
f>>n>>m;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
{
f>>ch;
if(ch=='D')
{
qx.push(i);
qy.push(j);
c[i][j]=1;
}
else
if(ch=='I')
xi=i,yi=j;
else
if(ch=='O')
xf=i,yf=j;
else
if(ch=='*')
c[i][j]=1;
}
prec();
st=1;
dr=min(e[xi][yi],e[xf][yf]);
init();
sol=-1;
while(st<=dr)
{
mij=(st+dr)>>1;
if(bfs(mij))
{
sol=mij;
st=mij+1;
}
else
dr=mij-1;
}
g<<sol;
return 0;
}