Pagini recente » Cod sursa (job #2364604) | Cod sursa (job #2208558)
#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 A[Dim][Dim], B[Dim][Dim],C[Dim][Dim],n,k,m,si,sj,fi,fj;
char O[Dim][Dim];
pair < int , int > D[Dim];
struct sr{
int first,second;
};
queue < sr > 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;
else
if( O[i][j] == '*' )
A[i][j] = 1;
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 A[i][j] == 0;
}
void LeeD() {
int i,j;
while(! Q.empty() ) {
i = Q.front().first;
j = Q.front().second;
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() ) {
i = Q.front().first;
j = Q.front().second;
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]} );
}
}
}