Pagini recente » Cod sursa (job #1932019) | Cod sursa (job #2805105) | Cod sursa (job #521805) | Cod sursa (job #3261313) | Cod sursa (job #475236)
Cod sursa(job #475236)
#include<fstream>
#include<queue>
using namespace std;
#define NMAX 1003
#define INF 1000000000
ifstream fi("barbar.in");
ofstream fo("barbar.out");
int dl[4]={0,-1,0,1},dc[4]={-1,0,1,0};
int l,c,li,ci,lo,co,i,j;
char h[NMAX][NMAX];
int dr[NMAX][NMAX],barb[NMAX][NMAX];
queue< pair<int,int> > q;
void bfsDr(int lin,int col) {
if(!dr[lin][col]) return;
pair<int,int> per;
int lc,cc,lu,cu,i;
dr[lin][col]=0;
q.push(make_pair(lin,col));
while(!q.empty()) {
per=q.front();
lc=per.first;
cc=per.second;
q.pop();
for(i=0;i<4;++i) {
lu=lc+dl[i];
cu=cc+dc[i];
if(lu>=0 && lu<l && cu>=0 && cu<c)
if(h[lu][cu]!='*' && dr[lu][cu]>dr[lc][cc]+1) {
if(h[lu][cu]=='D') dr[lu][cu]=0;
else dr[lu][cu]=dr[lc][cc]+1;
q.push(make_pair(lu,cu));
}
}
}
}
void bfsBarb() {
pair<int,int> per;
int lc,cc,lu,cu,i,vmin;
barb[li][ci]=dr[li][ci];
q.push(make_pair(li,ci));
while(!q.empty()) {
per=q.front();
lc=per.first;
cc=per.second;
q.pop();
for(i=0;i<4;++i) {
lu=lc+dl[i];
cu=cc+dc[i];
if(lu>=0 && lu<l && cu>=0 && cu<c)
if(h[lu][cu]!='*') {
vmin=min(barb[lc][cc],dr[lu][cu]);
if(vmin>barb[lu][cu]) {
barb[lu][cu]=vmin;
q.push(make_pair(lu,cu));
}
}
}
}
}
int main() {
fi>>l>>c;
for(i=0;i<l;++i) fi>>h[i];
for(i=0;i<l;++i)
for(j=0;j<c;++j) {
dr[i][j]=INF;
barb[i][j]=-INF;
}
for(i=0;i<l;++i)
for(j=0;j<c;++j)
switch(h[i][j]) {
case 'I': li=i,ci=j; break;
case 'O': lo=i; co=j; break;
case 'D': bfsDr(i,j);
}
bfsBarb();
if(barb[lo][co]>-INF) fo<<barb[lo][co];
else fo<<-1;
return 0;
}