Pagini recente » Cod sursa (job #1454200) | Cod sursa (job #349989) | Clasament 9_2 | Cod sursa (job #1927545) | Cod sursa (job #1052671)
#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();
bool Test(int x);
void Solve();
bool Ok(int a, int b);
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 a, int b)
{
if ( a < 1 || b < 1 || a > n || b > m )
return false;
return true;
}
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 q = valmax; q >= 1; --q )
if ( Test(q) == true )
{
os << q-1;
break;
}
}