Pagini recente » Cod sursa (job #1213001) | Cod sursa (job #2902937) | Cod sursa (job #2099421) | Cod sursa (job #1856497) | Cod sursa (job #1265363)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
#define Nmax 1000
#define nrDir 4
int m, n;
int dl[nrDir] = {-1, 0, 1, 0};
int dc[nrDir] = {0, 1, 0, -1};
int t[Nmax][Nmax];
char s[Nmax + 1];
pair< int, int > I, O;
queue< pair<int, int> > Q;
vector< bool > viz[Nmax];
void read() ;
void gen() ;
bool ok(int) ;
int main()
{
int st, dr, mijl, gasit = 0, rez;
read();
gen();
/*for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j) fout << t[i][j] << ' ';
fout << '\n';
}
*/
for(st = 0, dr = m * n; st <= dr; )
{
mijl = (st + dr) >> 1;
if(ok(mijl)) st = mijl + 1, gasit = 1, rez = mijl;
else dr = mijl - 1;
}
if(!gasit) fout << "-1\n";
else fout << rez << '\n';
return 0;
}
void read()
{
int i, j;
fin >> m >> n; fin.get();
for(i = 0; i < m; ++i)
{
viz[i].resize(n);
fin.getline(s, Nmax + 1);
for(j = 0; j < n; ++j)
switch(s[j])
{
case 'I': {I = make_pair(i, j); break;}
case 'O': {O = make_pair(i, j); break;}
case 'D': {Q.push( make_pair(i, j) ); viz[i][j] = 1; break;}
case '*': {t[i][j] = -1; break;}
}
}
}
void gen()
{
int a, b;
pair< int, int > vf;
while( !Q.empty() )
{
vf = Q.front(); Q.pop();
for(int k = 0; k < nrDir; ++k)
{
a = vf.first + dl[k];
b = vf.second + dc[k];
if(0 <= a && a < m && 0 <= b && b < n)
if( t[a][b] != -1 && viz[a][b] == 0)
{
viz[a][b] = 1;
t[a][b] = 1 + t[vf.first][vf.second];
Q.push( make_pair(a, b) );
}
}
}
}
bool ok(int d)
{
if(t[I.first][I.second] < d) return 0;
int a, b;
pair< int, int > vf;
while( !Q.empty() ) Q.pop();
for(a = 0; a < m; ++a) fill(viz[a].begin(), viz[a].end(), 0);
Q.push(I); viz[I.first][I.second] = 1;
while( !Q.empty() )
{
vf = Q.front(); Q.pop();
for(int k = 0; k < nrDir; ++k)
{
a = vf.first + dl[k];
b = vf.second + dc[k];
if(0 <= a && a < m && 0 <= b && b < n)
if(viz[a][b] == 0 && t[a][b] >= d)
{
viz[a][b] = 1;
Q.push( make_pair(a, b) );
if(O == make_pair(a, b)) return 1;
}
}
}
return 0;
}