Pagini recente » Cod sursa (job #3341625) | Cod sursa (job #678762) | Cod sursa (job #118276) | Cod sursa (job #2529480) | Cod sursa (job #3311369)
#include <fstream>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
#define N 1005
int r, c, a[N][N], m, d[N][N];
struct pozitie
{
int lin, col;
}Q[N *N];
int prim, ultim;
int dl[] = {-1, 1, 0, 0};
int dc[] = {0, 0 , -1, 1};
int ls, cs, lf, cf;
struct dragon
{
int l, c;
}D[N];
int distmax = -1;
void citire()
{
fin >> r >> c;
char s;
prim = 1;
ultim = 0;
for(int i = 1; i <= r; i++)
for(int j = 1; j <= c; j++)
{
fin >> s;
if(s == 'I')
{
ls = i;
cs = j;
a[i][j] = 1;
d[i][j] = 0;
}
else if(s == 'O')
{
lf = i;
cf = j;
a[i][j] = d[i][j] = 0;
}
else if(s == 'D')
{
a[i][j] = 0;
d[i][j] = 1;
ultim++;
Q[ultim].lin = i;
Q[ultim].col = j;
}
else if(s == '*')
a[i][j] = d[i][j] = -1;
}
}
bool inside(int lin, int col)
{
return lin >= 1 && lin <= r && col >= 1 && col <= c;
}
void lee()
{
while(prim <= ultim )
{
int l = Q[prim].lin, c = Q[prim].col;
prim++;
for(int k = 0; k < 4; k++)
{
int lv = l + dl[k];
int cv = c + dc[k];
if(inside(lv, cv) && d[lv][cv] == 0)
{
ultim++;
Q[ultim].lin = lv;
Q[ultim].col = cv;
d[lv][cv] = d[l][c] + 1;
}
}
}
}
bool viz[N][N];
bool drum(int dmin)
{
if(d[ls][cs] < dmin)
return 0;
Q[1].lin = ls;
Q[1].col = cs;
prim = ultim = 1;
for(int i = 1; i <= r; i++)
for(int j = 1; j <= c; j++)
viz[i][j] = 0;
viz[ls][cs] = 1;
while(prim <= ultim)
{
int l = Q[prim].lin, c= Q[prim].col;
prim++;
if(l == lf && c == cf)
return 1;
for(int k = 0; k < 4; k++)
{
int lv = l + dl[k];
int cv = c + dc[k];
if(inside(lv, cv) && a[lv][cv] != -1 && !viz[lv][cv] && d[lv][cv] >= dmin)
{
viz[lv][cv] = 1;
ultim++;
Q[ultim].lin = lv;
Q[ultim].col = cv;
}
}
}
return 0;
}
void cb()
{
int st = 0, dr = r + c, mij, sol = -1;
while(st <= dr)
{
mij = (st + dr) / 2;
if(drum(mij))
{
sol = mij;
st = mij + 1;
}
else
dr = mij - 1;
}
fout << sol;
}
int main()
{
citire();
lee();
for(int i = 1; i <= r; i ++)
for(int j = 1; j <= c; j++)
d[i][j]--;
cb();
return 0;
}