Pagini recente » Cod sursa (job #749866) | Cod sursa (job #1850728) | Cod sursa (job #1525231) | Cod sursa (job #2589268) | Cod sursa (job #2872206)
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
const int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
int n,m;
queue <pair<int,int>> dq;
bool inside(int x,int y)
{
return x>0 && y>0 && x<=n && y<=m;
}
int drag[1011][1011],dragprov[1011][1011];
void dragoni()
{
int x,y;
while(dq.empty()==false)
{
x=dq.front().first;
y=dq.front().second;
dq.pop();
for(int k=0;k<4;k++)
{
int ix=x+dx[k],iy=y+dy[k];
if(inside(ix,iy)==1 && drag[ix][iy]==0 && dragprov[ix][iy]==0)
{
drag[ix][iy]=drag[x][y]+1;
dq.push(make_pair(ix,iy));
}
}
}
}
bool a[1011][1011],per[1011][1011];
int X,Y;
bool paftenie(int val,int x,int y)
{
queue <pair<int,int>> q;
q.push(make_pair(x,y));
memset(a,0,sizeof(a));
a[x][y]=1;
while(q.empty()==false)
{
x=q.front().first;
y=q.front().second;
q.pop();
for(int k=0;k<4;k++)
{
int ix=x+dx[k],iy=y+dy[k];
if(inside(ix,iy)==1 && drag[ix][iy]>=val && per[ix][iy]==0 && a[ix][iy]==0)
{
if(ix==X && iy==Y)
return 1;
a[ix][iy]=1;
q.push(make_pair(ix,iy));
}
}
}
return 0;
}
void solve(int x,int y)
{
int st=1,dr=min(drag[x][y],drag[X][Y]),sol=-1;
while(st<=dr)
{
int mij=(st+dr)/2;
if(paftenie(mij,x,y)==1)
{
sol=mij;
st=mij+1;
}
else
dr=mij-1;
}
g<<sol;
}
int i,j,x,y;
char c;
int main()
{
f>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
f>>c;
if(c=='.')
continue;
if(c=='I')
{
x=i;
y=j;
continue;
}
if(c=='O')
{
X=i;
Y=j;
continue;
}
if(c=='*')
{
per[i][j]=1;
continue;
}
if(c=='D')
{
per[i][j]=1;
dragprov[i][j]=1;
dq.push(make_pair(i,j));
}
}
dragoni();
solve(x,y);
return 0;
}