Pagini recente » Cod sursa (job #1242357) | Cod sursa (job #40892) | Cod sursa (job #1355546) | Cod sursa (job #1083706) | Cod sursa (job #1170250)
#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]==endX && y+dy[i]==endY) {
//cout<<"JFHSJ";
return true;
}
if(x+dx[i]>=0 && x+dx[i]<N && y+dy[i]>=0 && y+dy[i]<M) {
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 = min(d[startX][startY],d[endX][endY]);
int ret = -1;
while(st<=dr) {
int mij = (st+dr)/2;
//cout<<st<<" "<<dr<<endl;
reset_viz();
//cout<<good(mij)<<endl;
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;
}
}
// printf("\n");
}
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",good(2));
printf("%d",caut());
// printf("%d",d[endX][endY]);
/* for(int i=0;i<N;++i) {
for(int j=0;j<M;++j) {
printf("%d ",d[i][j]);
}
printf("\n");
}*/
return 0;
}