Pagini recente » Cod sursa (job #2327383) | Cod sursa (job #2766190) | Cod sursa (job #3288240) | Cod sursa (job #1558314) | Cod sursa (job #2602920)
#include <bits/stdc++.h>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1};
int a[1005][1005], b[1005][1005], d[1005][1005], xi, yi, xf, yf, st, dr, mij, rez = -1, n, m;
queue < pair < int, int > > Q;
char c;
void Fill(int i, int j, int dist)
{
a[i][j] = -1;
for(int k = 0; k < 4; ++ k)
{
int ii = i + dx[k];
int jj = j + dy[k];
if(a[ii][jj] == 0 && d[ii][jj] - 1 >= dist)
{
Fill(ii, jj, dist);
}
}
}
int main()
{
f >> n >> m;
// bordare
for(int i = 0; i <= n + 1; ++ i)
{
a[i][0] = a[i][m + 1] = b[i][0] = b[i][m + 1] = d[i][0] = d[i][m + 1] = -1;
}
for(int i = 0; i <= m + 1; ++ i)
{
a[0][i] = a[n + 1][i] = b[0][i] = b[n + 1][i] = d[0][i] = d[n + 1][i] = -1;
}
for(int i = 1; i <= n; ++ i)
{
for(int j = 1; j <= m; ++ j)
{
f >> c;
if(c == 'I')
{
xi = i;
yi = j;
}
else if(c == 'O')
{
xf = i;
yf = j;
}
else if(c == '*')
{
a[i][j] = b[i][j] = d[i][j] = -1;
}
else if(c == 'D')
{
Q.push({i, j});
d[i][j] = 1;
}
}
}
while(!Q.empty())
{
int i = Q.front().first;
int j = Q.front().second;
for(int k = 0; k < 4; ++ k)
{
int ii = i + dx[k];
int jj = j + dy[k];
if(!d[ii][jj])
{
d[ii][jj] = d[i][j] + 1;
Q.push({ii, jj});
}
}
Q.pop();
}
st = 0;
dr = n + m;
while(st <= dr)
{
mij = (st + dr) / 2;
memcpy(a, b, sizeof(b));
Fill(xi, yi, mij);
if(a[xf][yf] == 0 || d[xi][yi] <= mij)
dr = mij - 1;
else
{
rez = mij;
st = mij + 1;
}
}
g << rez << "\n";
return 0;
}