Pagini recente » Cod sursa (job #1703603) | Cod sursa (job #977713) | Cod sursa (job #1797193) | Cod sursa (job #2774950) | Cod sursa (job #419018)
Cod sursa(job #419018)
#include <cstdio>
#define RMAX 1005
#define CMAX 1005
#define INF 1000000000
int R , C = 1,D = 0;
int REZ = 0;
int xi, yi, xf, yf;
int dif,st,dr;
bool viz[RMAX][CMAX];
int e[RMAX][CMAX];
struct interval
{
int x,y;
};
interval coada[RMAX * CMAX];
int lin[5] = {0,-1,0,0,1};
int col[5] = {0,0,-1,1,0};
/*void scrie()
{
for(int i = 1 ; i <= R ; i++)
{
for(int j = 1 ; j <= C ; j++)
printf("%d ",e[i][j]);
printf("\n");
}
printf("\n\n\n");
}*/
void constructie()
{
char c;
scanf("%d %d", &R, &C);
for(int i = 1 ; i <= R ; i++)
for(int j = 1 ; j <= C ; j++)
{
scanf("%c",&c);
if(c == '\n')
scanf("%c",&c);
if(c == 'D')
{
coada[++dr].x = i;
coada[dr].y = j;
e[i][j] = 0;
D++;
continue;
}
if(c == '*')
{
e[i][j] = -1;
continue;
}
if(c == 'I')
xi = i, yi = j;
if(c == 'O')
xf = i, yf = j;
e[i][j] = INF;
}
}
void BFS()
{
st=1;
dr=D;
while(st <= dr)
{
for(int k = 1 ; k <= 4 ; k++)
if(e[coada[st].x + lin[k]][coada[st].y + col[k]] > e[coada[st].x][coada[st].y] + 1)
{
e[coada[st].x + lin[k]][coada[st].y + col[k]] = e[coada[st].x][coada[st].y] + 1;
coada[++dr].x = coada[st].x + lin[k];
coada[dr].y = coada[st].y + col[k];
}
st++;
}
}
void init()
{
for(int i = 1 ; i <= R ; i++)
viz[i][0] = 1, viz[i][C + 1] = 1;
for(int j = 1 ; j <= C ; j++)
viz[0][j] = 1, viz[R + 1][j] = 1;
}
bool C_DRUM(int val)
{
for(int i = 1 ; i <= R ; i++)
for(int j = 1 ; j <= C ; j++)
viz[i][j] = 0;
st = 1;
dr = 0;
if(e[xi][yi] >= val)
{
coada[++dr].x = xi;
coada[dr].y = yi;
viz[coada[dr].x][coada[dr].y] = 1;
}
else
return 0;
do
{
if(coada[st].x == xf && coada[st].y == yf)
return 1;
for(int k = 1 ; k <= 4 ; k++)
if(e[coada[st].x + lin[k]][coada[st].y + col[k]] >= val && !viz[coada[st].x + lin[k]][coada[st].y + col[k]])
{
coada[++dr].x = coada[st].x + lin[k];
coada[dr].y = coada[st].y + col[k];
viz[coada[dr].x][coada[dr].y] = 1;
}
st++;
}while(st <= dr);
return 0;
}
void caut_bin()
{
int i;
for(i = 1 ; i <= R * C ; i <<= 1);
i >>= 1;
while(i)
{
if(C_DRUM(REZ + i))
REZ += i;
i >>= 1;
}
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
constructie();
BFS();
init();
//scrie();
caut_bin();
if(REZ == 0)
printf("-1");
else
printf("%d",REZ);
return 0;
}