Pagini recente » Cod sursa (job #1563187) | Cod sursa (job #1217586) | Cod sursa (job #88173) | Cod sursa (job #2986909) | Cod sursa (job #2742623)
#include <bits/stdc++.h>
using namespace std;
ifstream ci("barbar.in");
ofstream cou("barbar.out");
struct coord
{
int x,y;
};
coord fin,intr;
int n,m,v[1005][1005],dragoni[1005][1005],lee[1005][1005],mxdrg;
short coordx[5]= {-1,0,1,0};
short coordy[5]= {0,1,0,-1};
queue<coord>drg;
queue<coord>q;
void citire()
{
ci>>n>>m;
int i,j;
char a;
coord w;
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
ci>>a;
if(a=='.')
{
v[i][j]=0;
}
if(a=='I' )
{
w.x=i;
w.y=j;
intr=w;
q.push(w);
//v[i][j]=1;
}
if(a=='D' )
{
w.x=i;
w.y=j;
drg.push(w);
v[i][j]=1;
}
if(a=='*' )
{
v[i][j]=1;
}
if(a=='O' )
{
fin.x=i;
fin.y=j;
}
}
}
}
bool Ok(int i,int j)
{
if(i>=1&&j>=1&&i<=n&&j<=m)
{
return 1;
}
return 0;
}
void Leedragoni()
{
coord w,w1;
while(!drg.empty())
{
w=drg.front();
drg.pop();
for(int i=0; i<=3; i++)
{
w1.x=w.x+coordx[i];
w1.y=w.y+coordy[i];
if(Ok(w1.x,w1.y))
{
if(dragoni[w1.x][w1.y]==0||dragoni[w1.x][w1.y]>dragoni[w.x][w.y]+1 )
{
drg.push(w1);
dragoni[w1.x][w1.y]=dragoni[w.x][w.y]+1;
}
}
}
}
}
void Lee(int k)
{
int i,j;
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
lee[i][j]=0;
}
}
coord w,w1;
while(!q.empty())
{
w=q.front();
q.pop();
if(dragoni[w.x][w.y]<k )
{
//cout<<dragoni[w.x][w.y]<<" ---------\n";
return;
}
for(int i=0; i<=3; i++)
{
w1.x=w.x+coordx[i];
w1.y=w.y+coordy[i];
if(Ok(w1.x,w1.y))
{
if(dragoni[w1.x][w1.y]>=k )
{
if(v[w1.x][w1.y]!=1 )
{
if(lee[w1.x][w1.y]==0||lee[w1.x][w1.y]!=1 )
{
q.push(w1);
lee[w1.x][w1.y]=1;
}
}
}
}
}
}
}
void afL()
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
cout<<lee[i][j]<<" ";
}
cout<<"\n";
}
cout<<"\n";
}
void rez()
{
int st=1,dr=n*m+3;
int mij;
int i,j,veri=0,sol=0;
while(st<=dr)
{
mij=(st+dr)/2;
if(dragoni[intr.x][intr.y]>=mij)
{
q.push(intr);
Lee(mij);
//cout<<st<<" "<<dr<<" "<<mij<<"\n";
//afL();
}
else
{
lee[fin.x][fin.y]=0;
}
if(lee[fin.x][fin.y]==0 )
{
dr=mij-1;
}
else
{
st=mij+1;
sol=mij;
}
}
if(sol==0)
{
cou<<"-1 ";
}
else
{
cou<<sol;
}
}
int main()
{
citire();
Leedragoni();
rez();
return 0;
}