Pagini recente » Cod sursa (job #2629157) | Cod sursa (job #1869340) | Cod sursa (job #2142906) | Cod sursa (job #2168509) | Cod sursa (job #2846094)
#include <bits/stdc++.h>
#define INF 1e9
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
char s[1005][1005];
int n, m, d[1005][1005],xs,ys,xf,yf, ok;
bitset <1005> viz[1005];
queue <pair <int, int > > Q;
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
bool OK(int i, int j)
{
return (1 <= i and i <= n and 1 <= j and j <= m);
}
void Fill(int x, int y, int val)
{
if (ok == 1 and OK(x, y) and viz[x][y] == 0 and d[x][y] >= val and s[x][y] != '*')
{
viz[x][y] = 1;
if (x == xf and y == yf)
ok = 0;
Fill(x - 1, y, val);
Fill(x + 1, y, val);
Fill(x, y - 1, val);
Fill(x, y + 1, val);
}
}
bool Check(int mij)
{
int i, j;
for (i = 1; i <= n; i++)
viz[i].reset();
ok = 1;
Fill(xs, ys, mij);
return viz[xf][yf];
}
int main()
{
int i, j,x,y,k,st,dr,mij, sol = - 1;
fin >> n >> m;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
{
fin >> s[i][j];
d[i][j] = INF;
if (s[i][j] == 'I') { xs = i; ys = j; }
else if (s[i][j] == 'O') { yf = j; xf = i; }
else if (s[i][j] == 'D') { d[i][j] = 0; Q.push({ i,j }); }
}
while (!Q.empty())
{
x = Q.front().first;
y = Q.front().second;
Q.pop();
for (k = 0; k <= 3; k++)
{
i = x + dx[k];
j = y + dy[k];
if (OK(i, j) and s[i][j] != '*' and d[i][j] > 1 + d[x][y])
{
d[i][j] = d[x][y] + 1;
Q.push({ i,j });
}
}
}
st = 1;
dr = d[xf][yf];
while (st <= dr)
{
mij = (st + dr) / 2;
if (Check(mij))
{
sol = mij;
st = mij + 1;
}
else dr = mij - 1;
}
fout << sol << "\n";
return 0;
}