Pagini recente » Cod sursa (job #623777) | Cod sursa (job #1944581) | Cod sursa (job #815362) | Cod sursa (job #1941542) | Cod sursa (job #2412523)
#include <iostream>
#include <fstream>
#include <queue>
#define Nmax 1005
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n, m;
pair <int, int> b, e;
queue < pair <int, int> > Q;
int mp[Nmax][Nmax];
bool a[Nmax][Nmax];
int dx[] = {-1, 1, 0, 0};
int dy[] = { 0, 0, 1,-1};
void lee()
{
while(!Q.empty())
{
int x=Q.front().first;
int y=Q.front().second;
Q.pop();
for (int i = 0; i <= 3; i++)
{
int xx = x + dx[i];
int yy = y + dy[i];
if(mp[xx][yy] == 0)
{
mp[xx][yy] = mp[x][y] + 1;
Q.push({xx, yy});
}
}
}
}
void erase()
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
a[i][j] = true;
}
bool ok(int i, int j, int val)
{
if(mp[i][j] > val && a[i][j])
{
a[i][j] = false;
return ((i == e.first && j == e.second) ||
ok(i, j-1, val) || ok(i, j+1, val) ||
ok(i-1, j, val) || ok(i+1, j, val));
}
return false;
}
int solve()
{
int lft = 1, rgt = 1005*2, md, ans=-1;
while(lft <= rgt)
{
erase();
md = (lft + rgt) / 2;
if(ok(b.first, b.second, md))
{
lft = md + 1;
ans=md;
}
else
rgt = md - 1;
}
return ans;
}
int main()
{
char c;
f >> n >> m;
for (int i = 1; i <= n; i++)
{
f.get();
for (int j = 1; j <= m; j++)
{
f.get(c);
if(c == 'I')
b={i, j};
else if(c == 'O')
e={i, j};
else if(c == 'D')
{
mp[i][j] = 1;
Q.push(make_pair(i, j));
}
else if(c == '*')
mp[i][j] = -1;
}
}
for (int i = 0; i <= n+1; i++)
mp[i][0] = mp[i][m+1] = -1;
for (int i = 0; i <= m+1; i++)
mp[0][i] = mp[n+1][i] = -1;
lee();
g << solve();
}