Pagini recente » Cod sursa (job #619757) | Cod sursa (job #233494) | Cod sursa (job #1512646) | Cod sursa (job #74570) | Cod sursa (job #2823449)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n, m, istart, jstart, istop, jstop;
vector< vector<int> > a, viz;
queue< pair<int, int> > q;
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
void citire()
{
char x;
fin >> n >> m;
a.resize(n);
for(int i = 0; i < n; i++)
a[i].resize(m);
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
{
fin >> x;
if(x == 'I')
{
istart = i;
jstart = j;
}
else if(x == 'O')
{
istop = i;
jstop = j;
}
else if(x == 'D')
{
q.push({i, j});
a[i][j] = 1;
}
else if(x == '*')
a[i][j] = -1;
}
}
void viz_q_init()
{
viz.clear();
viz.resize(n);
for(int i = 0; i < n; i++)
viz[i].resize(m);
while(!q.empty())
q.pop();
}
bool inmatr(int i, int j)
{
return (i >= 0) && (j >= 0) && (i < n) && (j < m);
}
void lee_dragon()
{
pair<int, int> w;
while(!q.empty())
{
w = q.front();
q.pop();
for(int dir = 0; dir < 4; dir++)
{
int ii = w.first + dx[dir];
int jj = w.second + dy[dir];
if(inmatr(ii, jj) && a[ii][jj] == 0)
{
a[ii][jj] = a[w.first][w.second] + 1;
q.push({ii, jj});
}
}
}
}
bool lee(int k)
{
pair<int, int> w;
viz[istart][jstart] = 1;
q.push({istart, jstart});
while(!q.empty())
{
w = q.front();
q.pop();
for(int dir = 0; dir < 4; dir++)
{
int ii = w.first + dx[dir];
int jj = w.second + dy[dir];
if(inmatr(ii, jj) && k < a[ii][jj] && viz[ii][jj] == 0)
{
q.push({ii, jj});
viz[ii][jj] = 1;
}
}
if(viz[istop][jstop] == 1)
return true;
}
return false;
}
int caut_bin()
{
int st = 1, dr, mij, sol = -1;
dr = min(a[istart][jstart], a[istop][jstop]) - 1;
while(st <= dr)
{
mij = st + (dr - st) / 2;
viz_q_init();
if(lee(mij))
{
sol = mij;
st = mij + 1;
}
else dr = mij - 1;
}
return sol;
}
int main()
{
citire();
lee_dragon();
fout << caut_bin() << "\n";
fin.close();
fout.close();
return 0;
}