Pagini recente » Cod sursa (job #2566764) | Cod sursa (job #225639) | Cod sursa (job #73926) | Cod sursa (job #2648640) | Cod sursa (job #1170253)
#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 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;
}
}
}
bool dfs(int x, int y, int D) {
viz[x][y]=1;
bool ret=false;
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) {
return true;
}
if(!viz[x+dx[i]][y+dy[i]] && d[x+dx[i]][y+dy[i]]>=D) {
ret = ret || dfs(x+dx[i],y+dy[i],D);
}
}
}
return ret;
}
bool good(int D) {
return dfs(startX,startY,D);
}
int caut() {
int st = 0, dr = N+M;
int ret = -1;
while(st<=dr) {
int mij = (st+dr)/2;
reset_viz();
if(good(mij)) {
ret = mij;
st = mij+1;
} else {
dr = mij-1;
}
}
return ret;
}
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*N+j);
} else if(c=='*') {
d[i][j]=-2;
} else {
d[i][j]=-1;
}
}
}
while(!q.empty()) {
int curr = q.front(), x = curr/N, y = curr%N;
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])*N + (y+dy[i]));
}
}
}
}
printf("%d",caut());
return 0;
}