Pagini recente » Istoria paginii utilizator/stargold2 | Cod sursa (job #2286968) | Cod sursa (job #1177690) | Statistici Simon Wil (0738076326) | Cod sursa (job #2960966)
#include <bits/stdc++.h>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n, m, pi, pj, sol = -1, st, dr, mid, ii, ij;
int A[1005][1005], viz[1005][1005];
char x;
queue< pair<int, int> > Q;
bool verif(int lin, int col)
{
return (lin >= 1 && lin <= n && col >= 1 && col <= m );
}
bool solution(int middle)
{
int l, c, il, ic;
int dl[4] = {0, 0, 1, -1};
int 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(int 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()
{
int l, c, il, ic;
int dl[4] = {0, 0, 1, -1};
int dc[4] = {1, -1, 0, 0};
while(!Q.empty())
{
l = Q.front().first;
c = Q.front().second;
for(int 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(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
{
f >> x;
if(x == 'I')
{
pi = i;
pj = j;
}
else if(x == '*')
A[i][j] = -1;
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(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
viz[i][j] = 0;
}
g << sol;
return 0;
}