Pagini recente » Cod sursa (job #1722441) | Cod sursa (job #2939061) | Cod sursa (job #2188483) | Cod sursa (job #2102465) | Cod sursa (job #1027444)
#include <cstdio>
#include <vector>
using namespace std;
int N, M;
int map[1009][1009];
vector <pair<int, int> > coad[1009]; // pun in coada casutele la distanta x de cel mai apropiat dragon prin care pot sa trec
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
void fill(int x, int y)
{
int val = map[x][y] + 1;
for (int i = 0; i < 4; ++i)
if (x + dx[i] > 0 && x + dx[i] <= N && y + dy[i] > 0 && y + dy[i] <=M)
if (map[x + dx[i]][y + dy[i]] > val || map[x + dx[i]][y + dy[i]] == 0)
map[x + dx[i]][y + dy[i]] = val, fill(x + dx[i], y + dy[i]);
}
int main()
{
int xx, xy, yx, yy;
freopen("barbar.in", "r", stdin);
freopen("barbar.out", "w", stdout);
scanf("%d %d\n", &N, &M);
for (int i = 1; i <= N; ++i)
{
char S[1009];
scanf("%s", &S);
for (int j = 0; j < M; ++j)
if (S[j] == '*')
map[i][j + 1] = -1;
else
if (S[j] == 'D')
map[i][j + 1] = 1;
else
if (S[j] == 'I')
xx = i, xy = j + 1;
else
if (S[j] == 'O')
yx = i, yy = j + 1;
}
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= M; ++j)
if (map[i][j] == 1)
fill(i,j);
/*for (int i = 1; i<= N; ++i)
{
for (int j = 1 ; j <= M; ++j)
printf("%d ", map[i][j]);
printf("\n");
} */
coad[map[xx][xy]].push_back(make_pair(xx,xy));
for (int i = map[xx][xy]; i > 1; --i)
{
while (!coad[i].empty())
{
int x = coad[i].back().first, y = coad[i].back().second;
coad[i].pop_back();
for (int j = 0; j < 4; ++j)
if (x + dx[j] > 0 && x + dx[j] <= N && y + dy[j] > 0 && y + dy[j] <=M)
{
if (map[x + dx[j]][y + dy[j]] >= map[x][y])
map[x + dx[j]][y + dy[j]] = 0, coad[i].push_back(make_pair(x + dx[j], y + dy[j]));
else
if (map[x + dx[j]][y + dy[j]] > 1)
map[x + dx[j]][y + dy[j]] = 0, coad[map[x + dx[j]][y + dy[j]]].push_back(make_pair(x + dx[j], y + dy[j]));
}
}
if (map[yx][yy] == 0)
{
printf("%d\n", i - 2);
break;
}
}
return 0;
}