Pagini recente » Cod sursa (job #3131117) | Cod sursa (job #2555911) | Cod sursa (job #854922) | Cod sursa (job #282905) | Cod sursa (job #2434214)
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
int Ox[4]={1, 0, -1, 0};
int Oy[4]={0, 1, 0, -1};
int N, M, i, j, k, Dist[1001][1001], Map[1001][1001], L, R, mid;
bool Good[2002];
queue<pair<int, int> > Q; char c;
pair<int, int> Start, Finish;
void formDist();
bool BFS(int distance);
int main()
{
freopen("barbar.in", "r", stdin);
freopen("barbar.out", "w", stdout);
scanf("%d%d", &N, &M); fgetc(stdin);
for(i=1; i<=N; ++i){
for(j=1; j<=M; ++j){
scanf("%c", &c);
if(c=='.' || c=='O') Map[i][j]=0;
if(c=='O') Finish={i, j};
if(c=='I'){Map[i][j]=1; Start={i, j};}
if(c=='D'){Map[i][j]=-1; Dist[i][j]=1; Q.push({i, j});}
if(c=='*') Map[i][j]=Dist[i][j]=-2;
}
fgetc(stdin);
}
while(!Q.empty()){
pair<int, int> P=Q.front(); Q.pop();
for(k=0; k<4; ++k){
pair<int, int> P1={P.first+Ox[k], P.second+Oy[k]};
if(P1.first<1 || P1.first>N || P1.second<1 || P1.second>M || Dist[P1.first][P1.second]!=0) continue;
Dist[P1.first][P1.second]=Dist[P.first][P.second]+1;
Q.push(P1);
}
}
L=2; R=min(Dist[Start.first][Start.second], Dist[Finish.first][Finish.second]);
if(BFS(1)==false){printf("-1"); return 0;}
while(true){
mid=(L+R)/2;
if(BFS(R)==true) {printf("%d", R-1); return 0;}
if(Good[mid]==true){printf("%d", mid-1); return 0;}
else Good[mid]=true;
if(BFS(mid)==true) L=mid;
else R=mid-1;
}
return 0;
}
bool BFS(int distance){
while(!Q.empty()) Q.pop();
Q.push(Start);
for(i=1; i<=N; ++i)
for(j=1; j<=M; ++j) if(Map[i][j]>1) Map[i][j]=0;
while(!Q.empty()){
pair<int, int> P=Q.front(); Q.pop();
for(k=0; k<4; ++k){
pair<int, int> P1={P.first+Ox[k], P.second+Oy[k]};
if(P1.first<1 || P1.first>N || P1.second<1 || P1.second>M || Map[P1.first][P1.second]!=0 || Dist[P1.first][P1.second]<distance) continue;
if(P1==Finish) return true;
Map[P1.first][P1.second]=2;
Q.push(P1);
}
}
return false;
}