Pagini recente » Cod sursa (job #321573) | Cod sursa (job #762222) | Cod sursa (job #2603841) | Cod sursa (job #3163012) | Cod sursa (job #1139508)
//#include <iostream>
#include<fstream>
#include<queue>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
#define nmax 1009
queue<pair<int,int> > q;
int i,j,n,m,dist[nmax][nmax],xin,xout,yin,yout,t;
char c[nmax][nmax];
bool v[nmax][nmax];
int main()
{
cin>>n>>m;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
dist[i][j]=5000000;
}
}
for(i=1;i<=n;i++){
cin>>(c[i]+1);
for(j=1;j<=m;j++){
if(c[i][j]=='I'){
xin=i;
yin=j;
}else if(c[i][j]=='O'){
xout=i;
yout=j;
}else if(c[i][j]=='*'){
v[i][j]=1;
}else if(c[i][j]=='D'){
v[i][j]=1;
q.push(make_pair(i,j));
dist[i][j]=0;
}
}
}
int vec[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
#define vi i+vec[a][0]
#define vj j+vec[a][1]
while(!q.empty()){
i=q.front().first;
j=q.front().second;
q.pop();
for(int a=0;a<4;a++){
if(vi>0 && vj>0 && vi<=n && vj<=m && v[vi][vj]==false && dist[vi][vj]>dist[i][j]+1){
dist[vi][vj]=dist[i][j]+1;
q.push(make_pair(vi,vj));
}
}
}
bool ok[1009][1009]={};
q.push(make_pair(xin,yin));
while(!q.empty() && ok[xout][yout]==0){
i=q.front().first;
j=q.front().second;
q.pop();
ok[i][j]=1;
for(int a=0;a<4;a++){
if(vi>0 && vj>0 && vi<=n && vj<m && ok[vi][vj]==0 && c[vi][vj]!='D' && c[vi][vj]!='*'){
q.push(make_pair(vi,vj));
}
}
}
if(!ok[xout][yout]){
cout<<-1;
return 0;
}
while(!q.empty()){
q.pop();
}
int dr=2001;
int st=0;
while(st<dr){
int mid=(st+dr)/2;
bool ok[1009][1009]={};
ok[xin][yin]=1;
q.push(make_pair(xin,yin));
while(!q.empty()){
i=q.front().first;
j=q.front().second;
q.pop();
for(int a=0;a<4;a++){
if(vi>0 && vj>0 && vi<=n && vj<=m && ok[vi][vj]==0 && dist[vi][vj]>mid){
ok[vi][vj]=1;
q.push(make_pair(vi,vj));
}
}
}
if(ok[xout][yout]){
st=mid+1;
}else{
dr=mid;
}
}
cout<<st;
return 0;
}