Pagini recente » Cod sursa (job #1034341) | Cod sursa (job #1961683) | Cod sursa (job #551336) | Cod sursa (job #1726396) | Cod sursa (job #1052543)
#include <fstream>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
#define DIM 1001
const int di[] = {-1,0,1,0};
const int dj[] = {0,1,0,-1};
ifstream is("barbar.in");
ofstream os("barbar.out");
queue <pair<int,int> > Q;
int a[DIM][DIM],n,m,i1,i2,j1,j2;
bool marked[DIM][DIM];
char v,c[DIM][DIM];
int valmax;
int result;
void Read();
void Lee();
void Debug();
bool Test(int x);
void Solve();
bool Ok(int i, int j);
int main()
{
Read();
Lee();
Solve();
return 0;
}
void Read()
{
is >> n >> m;
is.get(v);
for ( int i = 1; i <= n; ++i )
{
for ( int j = 1; j <= m; ++j )
{
is.get(v);
c[i][j] = v;
if ( v == 'D')
{
a[i][j] = 1;
Q.push(make_pair(i,j));
}
if ( v == 'I')
{
i1 = i;
j1 = j;
}
if ( v == 'O')
{
i2 = i;
j2 = j;
}
if ( v == '*' )
{
a[i][j] = -1;
}
}
is.get(v);
}
}
void Lee()
{
int i,j,iv,jv;
while ( !Q.empty() )
{
i = Q.front().first; j = Q.front().second;
Q.pop();
for ( int d = 0; d < 4; ++d )
{
iv = i+di[d];
jv = j+dj[d];
if ( Ok(iv,jv) && c[iv][jv] != '*' && a[iv][jv] == 0 && c[iv][jv] != 'D')
{
a[iv][jv] = a[i][j] + 1;
valmax = max(valmax,a[iv][jv]);
Q.push(make_pair(iv,jv));
}
}
}
}
bool Ok(int i, int j)
{
if ( i < 1 || j < 1 || i > n || j > m )
return false;
return true;
}
void Debug()
{
for ( int i = 1; i <= n; ++i )
{
for ( int j = 1; j <= m; ++j )
os << a[i][j] << " ";
os << '\n';
}
}
bool Test(int x)
{
int i,j,iv,jv;
Q.push(make_pair(i1,j1));
while (!Q.empty() )
{
i = Q.front().first;
j = Q.front().second;
Q.pop();
for ( int d = 0; d < 4; ++d )
{
iv = i + di[d];
jv = j + dj[d];
if ( Ok(iv,jv) && a[iv][jv] >= x && marked[iv][jv] == false )
{
marked[iv][jv] = true;
Q.push(make_pair(iv,jv));
if ( iv == i2 && jv == j2 )
{
memset(marked,false,sizeof(marked));
return true;
}
}
}
}
memset(marked,false,sizeof(marked));
return false;
}
void Solve()
{
valmax = a[i1][j1];
for ( int i = valmax; i >= 1; --i )
if ( Test(i) == true )
{
os << i-1;
break;
}
}