Pagini recente » Cod sursa (job #361053) | Cod sursa (job #1027172) | Cod sursa (job #96502) | Cod sursa (job #96494) | Cod sursa (job #1032822)
#include <fstream>
#include <cstring>
#define maxn 1010
#define inf 2001
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
string a[maxn];
int dir1[4] = {1,-1,0,0},dir2[4] = {0,0,1,-1};
int d[maxn][maxn];
bool viz[maxn][maxn];
int m,n,si,sj,fi,fj,s,l;
struct queue2d
{
int i,j;
}q[maxn*maxn];
void bfs (bool first, int val)
{
for (int i=0; i<m; ++i)
{
viz[n][i] = 1;
}
for (int i=0; i<n; ++i)
{
viz[i][m] = 1;
}
for (s=1; s<=l; ++s)
{
for (int k=0; k<4; ++k)
{
int ii = q[s].i + dir1[k], jj = q[s].j + dir2[k];
if (ii >= 0 && jj >= 0 && !viz[ii][jj] && d[ii][jj] >= val)
{
viz[ii][jj] = 1;
if (first) d[ii][jj] = d[q[s].i][q[s].j] + 1;
++l;
q[l].i = ii;
q[l].j = jj;
}
}
}
}
bool check (int val)
{
memset (viz,0,sizeof(viz));
viz[si][sj] = 1;
l=1;
q[1].i = si;
q[1].j = sj;
if (d[si][sj] >= val) bfs (0,val);
else return 0;
if (viz[fi][fj]) return 1;
return 0;
}
int main()
{
fin>>n>>m;
memset (d,1,sizeof(d));
for (int i=0; i<n; ++i)
{
fin>>a[i];
}
for (int i=0; i<n; ++i)
{
for (int j=0; j<m; ++j)
{
if (a[i][j]=='I')
{
si = i;
sj = j;
}
else if (a[i][j]=='O')
{
fi = i;
fj = j;
}
if (a[i][j]=='*')
{
d[i][j] = -1;
}
else if (a[i][j]=='D')
{
d[i][j] = 0;
++l;
q[l].i = i;
q[l].j = j;
viz[i][j] = 1;
}
}
}
bfs (1,0);
int hi = inf, lo = -1;
while (hi-lo > 1)
{
int mid = (lo+hi)/2;
if (check(mid))
lo = mid;
else
hi = mid;
}
fout<<lo;
}