Pagini recente » Cod sursa (job #73594) | Cod sursa (job #2489057) | Cod sursa (job #742473) | Cod sursa (job #510409) | Cod sursa (job #477880)
Cod sursa(job #477880)
#include <stdio.h>
#include <queue>
#define Nmax 1005
#define pb push_back
#define mp make_pair
#define x first
#define y second
using namespace std;
queue< pair< int,int > > Q;
int dx[4]={-1,0,1,0}, dy[4]={0,1,0,-1};
char s[Nmax][Nmax];
int dist[Nmax][Nmax],use[Nmax][Nmax];
int n,m,rez,xi,yi,xf,yf;
void dist_d(){
pair< int,int > p; int k,xx,yy;
while( ! Q.empty() ){
p=Q.front(); Q.pop();
for(k=0;k<4;++k){
xx=p.x+dx[k]; yy=p.y+dy[k];
if( xx>0 && yy>0 && xx<=n && yy<=m && s[xx][yy]=='.')
if( ! dist[xx][yy] ){
dist[xx][yy] = dist[p.x][p.y]+1;
Q.push(mp(xx,yy));
}
}
}
}
inline int merge(int val){
pair<int,int> p; int k,xx,yy;
while( ! Q.empty() ) Q.pop();
Q.push(mp(xi,yi));
if( dist[xi][yi] < val ) return 0;
while( ! Q.empty() ){
p=Q.front(); Q.pop();
if( p.x == xf && p.y==yf ) return 1;
for(k=0;k<4;++k){
xx=p.x+dx[k]; yy=p.y+dy[k];
if( xx>0 && yy>0 && xx<=n && yy<=m && s[xx][yy]=='.' )
if( dist[p.x+dx[k]][p.y+dy[k]] >= val && use[p.x+dx[k]][p.y+dy[k]]!=val ){
Q.push(mp(p.x+dx[k],p.y+dy[k]));
use[p.x+dx[k]][p.y+dy[k]]=val;
}
}
}
return 0;
}
void caut_bin(){
int l=0,r=n*m,mij;
while( l<=r ){
mij=l+(r-l)/2;
if( merge(mij) ) rez=mij, l=mij+1;
else r=mij-1;
}
}
int main(){
int i,j;
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d\n",&n,&m);
for(i=1;i<=n;++i)
scanf("%s\n",s[i]+1);
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
if(s[i][j]=='D') Q.push(mp(i,j)); else
if(s[i][j]=='O') xf=i, yf=j, s[i][j]='.'; else
if(s[i][j]=='I') xi=i, yi=j, s[i][j]='.';
dist_d();
caut_bin();
printf("%d\n",rez);
fclose(stdin); fclose(stdout);
return 0;
}