Pagini recente » Cod sursa (job #2578504) | Cod sursa (job #60153) | Cod sursa (job #426900) | Cod sursa (job #2594435) | Cod sursa (job #2922393)
#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 NMAX=1001;
int D[NMAX][NMAX]={0};
int R[NMAX][NMAX]={0};
int A[NMAX][NMAX]={0};
void LEE(){
int k,ni,nj,i,j;
while(q.size()>0)
{
i=q.front().first;
j=q.front().second;
q.pop();
for(k=0; k<4; k++){
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){
int i,j,k,ni,nj;
for(i=1; i<=r; i++){
for(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){
i=qq.front().first;
j=qq.front().second;
qq.pop();
for(k=0; k<4; k++){
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 && A[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=1,ri=r*c;
while(le<=ri){
mid=(le+ri)/2;
ex=LEEcb(mid);
if(ex){
minim=mid;
le=mid+1;
}
else
ri=mid-1;
}
return minim;
}
int main()
{
char ch;
int i,j;
cin>>r>>c;
for(i=1; i<=r; i++){
for(j=1; j<=c; j++){
cin>>ch;
if(ch=='*')
A[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;
}