Pagini recente » Cod sursa (job #2882330) | Cod sursa (job #2766147) | Cod sursa (job #2844168) | Cod sursa (job #2935632) | Cod sursa (job #1359114)
#include <fstream>
#include <queue>
#define nmax 1010
using namespace std;
ifstream is ("barbar.in");
ofstream os ("barbar.out");
queue <pair<int,int> >Q;
const int lin[] = {-1, 0, 1, 0};
const int col[] = {0, 1, 0, -1};
int D[nmax][nmax];
int N, M, L, R, si, sj, fi, fj, MAX, val, ANSW;
bool Vis[nmax][nmax], A[nmax][nmax];
void Read();
void Lee();
bool Ok(int,int);
bool Find();
int main()
{
Read();
Lee();
L = 1, R = MAX;
while( L <= R)
{
val = (L+R)/2;
Q.push({si, sj});
if(Find()) L = val+1, ANSW = val;
else R = val-1;
}
if(!val) os << -1;
else os << ANSW;
is.close();
os.close();
return 0;
}
void Read()
{
char ch;
is >> N >> M;
for(int i = 1; i <= N; ++i)
for(int j = 1; j <= M; ++j)
{
is >> ch;
switch(ch) {
case '*':
A[i][j] = true;
break;
case 'D':
A[i][j] = true;
Q.push({i, j});
break;
case 'I':
si = i, sj = j;
break;
case 'O':
fi = i, fj = j;
break;
}
}
}
void Lee()
{
int i, j, vi, vj;
while(!Q.empty())
{
i = Q.front().first;
j = Q.front().second;
Q.pop();
for(int d = 0; d < 4; ++d)
{
vi = i + lin[d];
vj = j + col[d];
if(Ok(vi, vj) && (D[vi][vj] > D[i][j] + 1 || !D[vi][vj]))
{
D[vi][vj] = D[i][j] + 1;
Q.push({vi, vj});
MAX = max(MAX, D[vi][vj]);
}
}
}
}
bool Ok(int i, int j)
{
if(!i || !j || i > N || j > M)
return false;
if(A[i][j])
return false;
return true;
}
bool Find()
{
int i, j, vi, vj;
if(D[si][sj] < val)
return false;
for(int i = 1; i <= N; ++i)
for(int j = 1; j <= M; ++j)
Vis[i][j] = false;
Vis[si][sj] = true;
while(!Q.empty())
{
i = Q.front().first;
j = Q.front().second;
Q.pop();
for(int d = 0; d < 4; ++d)
{
vi = i + lin[d];
vj = j + col[d];
if(Ok(vi, vj) && !Vis[vi][vj] && D[vi][vj] >= val)
{
Vis[vi][vj] = true;
Q.push({vi, vj});
}
}
}
return Vis[fi][fj];
}