Pagini recente » Cod sursa (job #2028872) | Cod sursa (job #333789) | Cod sursa (job #1346358) | Cod sursa (job #2796467) | Cod sursa (job #1170294)
#include<stdio.h>
#include<queue>
#include<iostream>
using namespace std;
int N,M,d[1010][1010], startX, endX, startY, endY;
int dx[]={0,0,1,-1}, dy[]={1,-1,0,0};
char c;
bool ret,viz[1010][1010];
queue<int> q;
void reset_viz() {
for(int i=0;i<N;++i) {
for(int j=0;j<M;++j) {
viz[i][j]=0;
}
}
}
void bfs(int D) {
// cout<<"AA"<<endl;
queue<int> q;
q.push(startX*M + startY);
while(!q.empty()) {
// cout<<q.size()<<endl;
int curr = q.front(), x = curr/M, y = curr%M;
viz[x][y]=1;
q.pop();
for(int i=0;i<4;++i) {
if(x+dx[i]>=0 && x+dx[i]<N && y+dy[i]>=0 && y+dy[i]<M) {
if(x+dx[i]==endX && y+dy[i]==endY) {
ret = true;
return;
}
if(!viz[x+dx[i]][y+dy[i]] && d[x+dx[i]][y+dy[i]]>=D) {
q.push((x+dx[i])*M + (y+dy[i]));
}
}
}
}
}
int caut() {
int st = 0, dr = min(d[startX][startY],d[endX][endY]);
int r = -1;
while(st<=dr) {
int mij = (st+dr)/2;
reset_viz();
ret = 0;
bfs(mij);
if(ret) {
r = mij;
st = mij+1;
} else {
dr = mij-1;
}
}
return r;
}
int main() {
// freopen("input.in","r",stdin);
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d",&N,&M);
for(int i=0;i<N;++i) {
scanf("%c",&c);
for(int j=0;j<M;++j) {
scanf("%c",&c);
if(c=='I') {
startX = i;
startY = j;
}
if(c=='O') {
endX = i;
endY = j;
}
if(c=='D') {
d[i][j]=0;
q.push(i*M+j);
} else if(c=='*') {
d[i][j]=-2;
} else {
d[i][j]=-1;
}
}
}
while(!q.empty()) {
int curr = q.front(), x = curr/M, y = curr%M;
q.pop();
for(int i=0;i<4;++i) {
if(x+dx[i]>=0 && x+dx[i]<N && y+dy[i]>=0 && y+dy[i]<M) {
if(d[x+dx[i]][y+dy[i]]==-1) {
d[x+dx[i]][y+dy[i]]=d[x][y]+1;
q.push((x+dx[i])*M + (y+dy[i]));
}
}
}
}
printf("%d",caut());
return 0;
}