Pagini recente » Cod sursa (job #2318189) | Cod sursa (job #354364) | Cod sursa (job #803046) | Cod sursa (job #1539044) | Cod sursa (job #2513699)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
int n, m;
int a[1001][1001];
int b[1001][1001];
int di[4] = {0, 0, -1, 1};
int dj[4] = {-1, 1, 0, 0};
char c;
int ii, jj, io, jo;
queue < pair <int, int> > Q;
queue < pair <int, int> > D;
bool OK(int i, int j)
{
if(i < 1 || j < 1 || i > n || j > m)
return 0;
if(a[i][j] == -1 || a[i][j] == -2)
return 0;
if(i == ii && j == jj)
return 0;
return 1;
}
int Lee(int dist)
{
for(int i = 1; i <= n; ++ i)
for(int j = 1; j <= m; ++ j)
a[i][j] = 0;
int i, j, next_i, next_j;
a[ii][jj] = 1;
Q.push(make_pair(ii, jj));
while(!Q.empty())
{
i = Q.front().first;
j = Q.front().second;
Q.pop();
for(int d = 0; d < 4; ++ d)
{
next_i = i + di[d];
next_j = j + dj[d];
if(OK(next_i, next_j) && b[next_i][next_j] >= dist && !a[next_i][next_j])
{
a[next_i][next_j] = a[i][j] + 1;
Q.push(make_pair(next_i, next_j));
}
}
}
if(a[io][jo])
return 1;
return 0;
}
void Dee()
{
int i, j, next_i, next_j;
while(!D.empty())
{
i = D.front().first;
j = D.front().second;
D.pop();
for(int d = 0; d < 4; ++ d)
{
next_i = i + di[d];
next_j = j + dj[d];
if(OK(next_i, next_j) && (b[next_i][next_j] > b[i][j] + 1 || !b[next_i][next_j]))
{
b[next_i][next_j] = b[i][j] + 1;
D.push(make_pair(next_i, next_j));
}
}
}
}
int main()
{
in >> n >> m;
for(int i = 1; i <= n; ++ i)
for(int j = 1; j <= m; ++ j)
{
in >> c;
if(c == '*') a[i][j] = -1;
if(c == 'D')
{
a[i][j] = -2;
D.push(make_pair(i, j));
}
if(c == 'I')
{
ii = i;
jj = j;
}
if(c == 'O')
{
io = i;
jo = j;
}
}
Dee();
int distance = 0;
for(int i = (1<<29); i >0; i /= 2)
{
if(Lee(distance + i))
distance += i;
}
out << distance;
return 0;
}