Pagini recente » Cod sursa (job #132584) | Cod sursa (job #781010) | Cod sursa (job #2283991) | Cod sursa (job #1420125) | Cod sursa (job #2823414)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n, m, istart, jstart, istop, jstop;
vector< vector<char> > a;
vector< vector<int> > viz;
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
void citire()
{
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 >> a[i][j];
if(a[i][j] == 'I')
{
istart = i;
jstart = j;
}
else if(a[i][j] == 'O')
{
istop = i;
jstop = j;
}
}
}
void viz_init()
{
viz.clear();
viz.resize(n);
for(int i = 0; i < n; i++)
viz[i].resize(m);
}
bool inmatr(int i, int j)
{
return (i >= 0) && (j >= 0) && (i < n) && (j < m);
}
void ffill(int i, int j, int k)
{
bool ok = true;
for(int dir = 0; dir < 4; dir++)
for(int d = 1; d < k && ok; d++)
if(inmatr(i + (d * dx[dir]), j + (d * dy[dir])))
if(a[i + (d * dx[dir])][j + (d * dy[dir])] == 'D')
return;
viz[i][j] = 1;
for(int dir = 0; dir < 4; dir++)
{
int ii = i + dx[dir];
int jj = j + dy[dir];
if(inmatr(ii, jj) && viz[ii][jj] == 0 && (a[ii][jj] == '.' || a[ii][jj] == 'O') && ok)
ffill(ii, jj, k);
}
}
int caut_bin()
{
int st = 1, dr = 1000, mij, sol = -1;
while(st <= dr)
{
mij = st + (dr - st) / 2;
viz_init();
ffill(istart, jstart, mij);
if(viz[istop][jstop] == 1)
{
sol = mij;
st = mij + 1;
}
else dr = mij - 1;
}
return sol;
}
int main()
{
citire();
fout << caut_bin() << "\n";
fin.close();
fout.close();
return 0;
}