Pagini recente » Cod sursa (job #3336555) | Cod sursa (job #2012457) | Cod sursa (job #50915) | Cod sursa (job #1820071) | Cod sursa (job #3316422)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
void calculdragoni();
bool ajunge(int val);
bool inmatrice(int i, int j);
int dirL[4] = {-1, 0, 1, 0}, dirC[4] = {0, 1, 0, -1};
int a[1002][1002], n, m, istart, jstart, ifin, jfin;
bool dragon[1002][1002];
queue<pair<int, int>> q;
int main()
{
fin>>n>>m;
for(int i = 1; i <= n; ++i)
{
fin.get();
for(int j = 1; j <= m; ++j)
{
char c;
fin.get(c);
if(c == '*')
a[i][j] = -1;
else if(c == 'I')
{
istart = i; jstart = j;
}
else if(c == 'O')
{
ifin = i; jfin = j;
}
else if(c == 'D')
{
dragon[i][j] = true;
q.push({i, j});
}
}
}
calculdragoni();
int st = 1, dr = 2002, rez = 0;
while(st <= dr)
{
int mijl = (st + dr) / 2;
if(ajunge(mijl))
{
rez = mijl;
st = mijl+1;
}
else
dr = mijl - 1;
}
if(rez == 0)
fout<<-1;
else
fout<<rez;
return 0;
}
bool ajunge(int val)
{
queue<pair<int, int>> coada;
bool viz[1002][1002] = {};
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= m; ++j)
viz[i][j] = false;
}
viz[istart][jstart] = 1;
coada.push({istart, jstart});
while(!coada.empty())
{
int l = coada.front().first, c = coada.front().second;
coada.pop();
for(int k = 0; k <= 3; ++k)
{
int lin = l + dirL[k], col = c + dirC[k];
if(inmatrice(lin, col) && !viz[lin][col] && !dragon[lin][col] && a[lin][col] > 0 && a[lin][col] >= val)
{
if(lin == ifin && col == jfin)
return true;
viz[lin][col] = 1;
coada.push({lin, col});
}
}
}
return false;
}
void calculdragoni()
{
while(!q.empty())
{
int l = q.front().first, c = q.front().second;
q.pop();
for(int k = 0; k <= 3; ++k)
{
int lin = l + dirL[k], col = c + dirC[k];
if(inmatrice(lin, col) && a[lin][col] == 0 && !dragon[lin][col])
{
a[lin][col] = a[l][c] + 1;
q.push({lin, col});
}
}
}
}
bool inmatrice(int i, int j)
{
return (1 <= i && 1 <= j && i <= n && j <= m);
}