Pagini recente » Cod sursa (job #2505769) | Cod sursa (job #1943180) | Cod sursa (job #744402) | Cod sursa (job #2720819) | Cod sursa (job #1595499)
#include <fstream>
#include <algorithm>
#include <climits>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
struct point{
int x,y;
} I,O,D[1000100],C[3000000];
const int dx[4] = {1,0,-1,0},
dy[4] = {0,1,0,-1};
int A[1010][1010],N,M,d,l,r,rs,step;
bool B[1010][1010];
string S;
void Lee(){
l = 1;
while(r >= l){
for(int i = 0;i<4;i++){
int x = C[l].x + dx[i];
int y = C[l].y + dy[i];
if(A[x][y] > A[C[l].x][C[l].y]+1){
A[x][y] = A[C[l].x][C[l].y]+1;
C[++r].x = x;
C[r].y = y;
}
}
l++;
}
}
bool check(int val){
r = l = 1;
C[r].x = I.x;
C[r].y = I.y;
B[I.x][I.y] = 1;
while(r >= l){
for(int i = 0;i<4;i++){
int x = C[l].x + dx[i];
int y = C[l].y + dy[i];
if(A[x][y] >= val && !B[x][y]){
if(O.x == x && O.y == y){
for(int j = 1;j<=r;j++) B[C[j].x][C[j].y] = 0;
return true;
}
C[++r].x = x;
C[r].y = y;
B[x][y] = 1;
}
}
l++;
}
for(int j = 1;j<=r;j++) B[C[j].x][C[j].y] = 0;
return false;
}
int main(){
fin >> N >> M;
getline(fin,S);
for(int i = 1;i<=N;i++) A[i][0] = -1;
for(int i = 1;i<=M;i++) A[0][i] = -1;
for(int i = 1;i<=N;i++) A[i][M+1] = -1;
for(int i = 1;i<=M;i++) A[N+1][i] = -1;
for(int i = 1;i<=N;i++){
getline(fin,S);
for(int j = 0;j<int(S.length());j++){
A[i][j+1] = INT_MAX;
if(S[j] == '*') A[i][j+1] = -1;
else
if(S[j] == 'D') C[++r].x = i,C[r].y = j+1, A[i][j+1] = 0;
else
if(S[j] == 'I') I.x = i, I.y = j+1;
else
if(S[j] == 'O') O.x = i, O.y = j+1;
}
}
Lee();
step = 1024;
for(rs = 0;step;step>>=1)
if(rs+step <= 1000 && check(rs+step)) rs+=step;
if(rs) fout << rs;
else fout << -1;
return 0;
}