Pagini recente » Cod sursa (job #848441) | Cod sursa (job #1967970) | Cod sursa (job #731557) | Cod sursa (job #1979314) | Cod sursa (job #2293178)
# include<cstdio>
# include<queue>
# include<cstdlib>
const int NMAX = 1000;
struct lee
{
int x , y , distanta , dragx , dragy;
};
struct lee2
{
int x , y;
};
int n , m , startx , starty , stopx , stopy;
int viz[NMAX + 1][NMAX + 1];
int dx[] = {0 , -1 , 0 ,1 , 0};
int dy[] = {0 , 0 , 1 , 0 , -1};
std :: queue <lee> q;
std :: queue <lee2>q2;
int distanta(int x1 ,int y1 ,int x2 ,int y2)
{
return abs(x1 - x2) + abs(y1 - y2);
}
int v[NMAX + 1][NMAX + 1];
int distante[NMAX + 1][NMAX + 1];
int check(int sol)
{
for(int i = 1; i <= n ; i ++)
for(int j = 1; j <= m ; j ++)
viz[i][j] = 0;
if(sol <= distante[startx][starty]){
q2.push({startx , starty});
viz[startx][starty] = 1;
}
while(q2.empty() == false)
{
lee2 aux = q2.front();
q2.pop();
for(int i = 1; i <= 4 ; i ++)
{
lee2 next;
next.x = aux.x + dx[i];
next.y = aux.y + dy[i];
if(viz[next.x][next.y] == 0 && distante[next.x][next.y] >= sol)
{
q2.push(next);
viz[next.x][next.y] = 1;
}
}
}
if(viz[stopx][stopy] == 1)
return false;
return true;
}
int bs()
{
int r = 0 , p2 = 1 << 20;
while(p2)
{
if(check(r + p2) == 0)
r += p2;
p2 /= 2;
}
if(r == 0)
r = -1;
return r;
}
int main()
{
freopen("barbar.in" , "r" , stdin);
freopen("barbar.out" , "w" , stdout);
scanf("%d%d ", &n , &m);
for(int i = 1; i <= n ; i ++)
{
for(int j = 1 ; j <= m ; j ++){
scanf("%c " , &v[i][j]);
distante[i][j] = 999999;
if(v[i][j] == 'D'){
q.push({i , j , 0 , i , j});
distante[i][j] = 0;
}
if(v[i][j] == 'I')
{startx = i;starty = j;}
if(v[i][j] == 'O')
{stopx = i;stopy = j;}
}
}
while(q.empty() == false)
{
lee aux = q.front() , nexta;
q.pop();
for(int i = 1; i <= 4 ; i ++)
{
nexta.x = aux.x + dx[i];
nexta.y = aux.y + dy[i];
nexta.distanta = aux.distanta + 1;
nexta.dragx = aux.dragx;
nexta.dragy = aux.dragy;
if(nexta.distanta < distante[nexta.x][nexta.y] && v[nexta.x][nexta.y] != '*')
{
distante[nexta.x][nexta.y] = nexta.distanta;
q.push(nexta);
}
}
}
printf("%d" ,bs());
return 0;
}