Pagini recente » Cod sursa (job #1406764) | Cod sursa (job #2680914) | Cod sursa (job #283971) | Cod sursa (job #1724314) | Cod sursa (job #2960969)
#include <bits/stdc++.h>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
long long n, m, pi, pj, sol = -1, st, dr, mid, ii, ij;
long long A[1005][1005], viz[1005][1005];
char x;
queue< pair<long long, long long> > Q;
bool verif(long long lin, long long col)
{
return (lin >= 1 && lin <= n && col >= 1 && col <= m );
}
bool solution(long long middle)
{
long long l, c, il, ic;
long long dl[4] = {0, 0, 1, -1};
long long dc[4] = {1, -1, 0, 0};
Q.push({pi, pj});
viz[pi][pj] = 1;
while(!Q.empty())
{
l = Q.front().first;
c = Q.front().second;
for(long long i = 0; i < 4; i ++)
{
il = l + dl[i];
ic = c + dc[i];
if(verif(il, ic) && viz[il][ic] == 0 && A[il][ic] - 1 >= middle)
{
viz[il][ic] = 1;
Q.push({il, ic});
}
}
Q.pop();
}
if(viz[ii][ij] == 1)return true;
return false;
}
void Lee()
{
long long l, c, il, ic;
long long dl[4] = {0, 0, 1, -1};
long long dc[4] = {1, -1, 0, 0};
while(!Q.empty())
{
l = Q.front().first;
c = Q.front().second;
for(long long i = 0; i < 4; i ++)
{
il = l + dl[i];
ic = c + dc[i];
if(verif(il, ic) && A[il][ic] == 0)
{
A[il][ic] = A[l][c] + 1;
Q.push({il, ic});
}
}
Q.pop();
}
}
int main()
{
f >> n >> m;
for(long long i = 1; i <= n; i ++)
for(long long j = 1; j <= m; j ++)
{
f >> x;
if(x == 'I')
{
pi = i;
pj = j;
}
else if(x == 'D')
{
A[i][j] = 1;
Q.push({i, j});
}
else if(x == 'O')
{
ii = i;
ij = j;
}
}
Lee();
st = 1; dr = n * m;
while(st <= dr)
{
mid = (st + dr) / 2;
if(solution(mid))
{
sol = mid;
st = mid + 1;
}
else dr = mid - 1;
for(long long i = 1; i <= n; i ++)
for(long long j = 1; j <= m; j ++)
viz[i][j] = 0;
}
g << sol;
return 0;
}