Pagini recente » Cod sursa (job #2963154) | Cod sursa (job #536214) | Cod sursa (job #2845370) | Cod sursa (job #652959) | Cod sursa (job #2929139)
#include <fstream>
#include <queue>
using namespace std;
ifstream cin ("barbar.in");
ofstream cout ("barbar.out");
int r, c, ii, ij, fi, fj;
queue <pair <int,int> >q;
int di[]={-1,0,1,0};
int dj[]={0,1,0,-1};
const int N=1001;
int D[N][N];
int R[N][N]={0};
void LEE()
{
int i, j;
while(q.size()>0)
{
i=q.front().first;
j=q.front().second;
q.pop();
for(int k=0; k<4; k++)
{
int ni=i+di[k], nj=j+dj[k];
if(ni>0 && ni<=r && nj>0 && nj<=c && D[ni][nj]==0)
{
D[ni][nj]=D[i][j]+1;
q.push(make_pair(ni,nj));
}
}
}
}
bool LEEcb(int val)
{
for(int i=1; i<=r; i++)
{
for(int j=1; j<=c; j++)
R[i][j]=0;
}
queue <pair <int,int> >qq;
if(D[ii][ij]>val)
{
qq.push(make_pair(ii,ij));
R[ii][ij]=1;
}
while(qq.size()>0)
{
int i=qq.front().first, j=qq.front().second;
qq.pop();
for(int k=0; k<4; k++)
{
int ni=i+di[k], nj=j+dj[k];
if(ni>0 && ni<=r && nj>0 && nj<=c && D[ni][nj]>val && R[ni][nj]==0)
{
R[ni][nj]=R[i][j]+1;
qq.push(make_pair(ni,nj));
}
}
}
if(R[fi][fj])
{
return 1;
}
return 0;
}
int cb()
{
bool ex;
int mid,minim=r*c;
int le=0,ri=r*c;
while(le<=ri)
{
mid=(le+ri)/2;
ex=LEEcb(mid);
if(ex)
{
minim=mid;
le=mid+1;
}
else
{
ri=mid-1;
}
}
if(minim<r*c)
{
return minim;
}
return -1;
}
int main()
{
char ch;
cin >> r >> c;
for(int i=1; i<=r; i++)
{
for(int j=1; j<=c; j++)
{
cin >> ch;
if(ch=='*')
{
D[i][j]=-1;
}
else if(ch=='D')
{
q.push(make_pair(i,j));
D[i][j]=1;
}
else if(ch=='I')
{
ii=i;
ij=j;
}
else if(ch=='O')
{
fi=i;
fj=j;
}
}
}
LEE();
int rez=cb();
cout << rez;
return 0;
}
/*bool ex;
int mid,minim=r*c;
int le=0,ri=r*c;
while(le<=ri){
mid=(le+ri)/2;
ex=LEEcb(mid);
if(ex){
minim=mid;
le=mid+1;
}
else
ri=mid-1;
}
if(minim<r*c)
return minim;
return -1;*/