Pagini recente » Cod sursa (job #1192954) | Cod sursa (job #2216818) | Cod sursa (job #2637646) | Cod sursa (job #1444974) | Cod sursa (job #2208495)
#include <queue>
#include <fstream>
#include <iostream>
#include <tuple>
using namespace std;
ifstream fin ("barbar.in");
ofstream fout ("barbar.out");
const int Dim = 1001, Inf = 0x3f3f3f3f;
const int di[] = {1,-1,0,0}, dj[]={0,0,1,-1};
int B[Dim][Dim],C[Dim][Dim],n,k,m,si,sj,fi,fj;
char O[Dim][Dim];
pair < int , int > D[Dim];
queue < pair < int, int > > Q;
void LeeD() ;
void Lee();
int main() {
fin >> n >> m;
fin.get();
for ( int i = 1; i <= n; ++i){
fin >> (O[i] + 1);
for ( int j = 1 ; j <= m; ++j) {
if ( O[i][j] == 'D')
D[++k] = { i, j};
else
if ( O[i][j] == 'I' )
si = i , sj = j;
else
if ( O[i][j] == 'O' )
fi = i, fj = j;
B[i][j] = Inf;
C[i][j] = -1;
}
}
for ( int i = 1; i <= k; ++i) {
B[D[i].first][D[i].second] = 0;
Q.push({D[i].first, D[i].second});
}
LeeD();
Lee();
fout << C[fi][fj];
}
bool OK(int i , int j){
return 1 <= i and i <= n and 1 <= j and j <= m and O[i][j] == '.';
}
void LeeD() {
int i,j;
while(! Q.empty() ) {
tie(i,j) = Q.front();
Q.pop();
for ( int x = 0; x < 4; ++x)
if ( OK(i + di[x], j + dj[x] ) and B[i][j] + 1 < B[i + di[x]][j + dj[x]] ) {
B[i + di[x]][j + dj[x]] = B[i][j] + 1;
Q.push({i + di[x] , j + dj[x]} );
}
}
}
void Lee() {
int i,j;
Q.push({si,sj});
C[si][sj] = B[si][sj];
while(! Q.empty() ) {
tie(i,j) = Q.front();
Q.pop();
for ( int x = 0; x < 4; ++x)
if ( OK(i + di[x], j + dj[x] ) and C[i][j] > C[i + di[x]][j + dj[x]] ) {
C[i + di[x]][j + dj[x]] = min(C[i][j], B[i+di[x]][j+dj[x]]);
Q.push({i + di[x] , j + dj[x]} );
}
}
}