Pagini recente » Cod sursa (job #2300075) | Cod sursa (job #337778) | Cod sursa (job #1675473) | Cod sursa (job #2335489) | Cod sursa (job #418994)
Cod sursa(job #418994)
#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;
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++;
}
}
bool C_DRUM(int val)
{
int viz[RMAX][CMAX] = {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();
scrie();
BFS();
scrie();
caut_bin();
printf("%d",REZ + 1);
return 0;
}