Pagini recente » Cod sursa (job #2232806) | Cod sursa (job #1720250) | Cod sursa (job #1590033) | Cod sursa (job #1896680) | Cod sursa (job #3255487)
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#define int long long
using namespace std;
const int LIM = 1015;
char mat[LIM][LIM];
int flacari[LIM][LIM];
queue<pair<int, int>> q;
int dirx[] = {0, 0, -1, 1};
int diry[] = {1, -1, 0, 0};
int s1, s2, f1, f2;
int n, m;
int pericol[LIM][LIM];
void dfs(int i, int j, int nivel)
{
pericol[i][j] = -1;
for(int kk=0; kk<4; kk++)
{
int nx = i + dirx[kk], ny = j + diry[kk];
if( pericol[nx][ny] >= nivel && mat[nx][ny] != '*')
dfs(nx, ny, nivel);
}
}
bool check(int nivel)
{
if(flacari[s1][s2] < nivel)
return false;
for(int i=0; i<=n+1; i++)
for(int j=0; j<=m+1; j++)
pericol[i][j] = flacari[i][j];
dfs(s1, s2, nivel);
if(pericol[f1][f2] == -1)
return true;
return false;
}
int32_t main()
{
ifstream cin("barbar.in");
ofstream cout("barbar.out");
cin>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
flacari[i][j] = 21e8;
for(int i=0; i<=n+1; i++)
flacari[i][0] = -1, flacari[i][m+1] = -1;
for(int j=0; j<=m+1; j++)
flacari[0][j] = -1, flacari[n+1][j] = -1;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
cin>>mat[i][j];
if(mat[i][j] == 'D')
q.push({i, j}), flacari[i][j] = 0;
else if(mat[i][j] == 'I')
s1 = i, s2 = j;
else if(mat[i][j] == 'O')
f1 = i, f2 = j;
}
while(q.empty() == false)
{
int i = q.front().first, j = q.front().second;
q.pop();
for(int kk=0; kk<4; kk++)
if( flacari[ i+dirx[kk] ][ j+diry[kk] ] > flacari[i][j] + 1 )
q.push({i+dirx[kk], j+diry[kk]}), flacari[ i+dirx[kk] ][ j+diry[kk] ] = flacari[i][j] + 1;
}
int maxx = 0;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
maxx = max(maxx, flacari[i][j]);
int st = 1, dr = maxx;
while(st <= dr)
{
int mij = (st + dr) / 2;
if(check(mij) == true)
st = mij + 1;
else
dr = mij - 1;
}
if(check(0) == false)
cout<<-1;
else
cout<<(st + dr) / 2;
return 0;
}