POJ 3669 Meteor Shower 宽搜

POJ 3669 Meteor Shower 宽搜

题目大意:
一个杯具男在地上躲陨石。用坐标轴的第一象限表示他的位置。
初始时刻他位于坐标轴原点。单位时间内他只能移动一格。
有很多块陨石在不同时刻砸下来,陨石砸的时候会把上下左右和中间的格子砸坏。
格子一旦砸坏了就不能再经过了。
问,杯具男要怎么走才能在最短时间内走到一个安全地点---陨石不会落下的地方。

思路:
BFS搜索。如果走到某个地方,发现陨石已经掉下来了,就不继续走了。很常规的思路,呵呵。
代码速度还行。根据排行来看~

注意:
Disscuss里有人说,此题数组要开到400。

#include  < stdio.h >

int  map[ 450 ][ 450 ];
char  visited[ 450 ][ 450 ];

struct  node  {
    
struct {
        
int x, y;
    }
 arr[8192];
    
int cnt;
}
 _queue[ 2 ],  * cur,  * nxt;

__inline 
int  in_range( int  x,  int  y)
{
    
return !(x < 0 || y < 0);
}


__inline 
void  insert( struct  node  * n,  int  x,  int  y)
{
    
if (!in_range(x, y) || visited[x][y])
        
return ;
    n
->arr[n->cnt].x = x;
    n
->arr[n->cnt].y = y;
    visited[x][y] 
= 1;
    n
->cnt++;
}


__inline 
void  crash( int  x,  int  y,  int  t)
{
    
if (!in_range(x, y))
        
return ;
    
if (!map[x][y] || t + 1 < map[x][y])
        map[x][y] 
= t + 1;
}


int  solve()
{
    
int x, y, step, i, t;

    _queue[
0].cnt = 1;
    visited[
0][0= 1;
    
for (step = 0; ; step++{
        cur 
= &_queue[step & 1];
        nxt 
= &_queue[(step + 1& 1];
        
if (!cur->cnt)
            
return -1;
        nxt
->cnt = 0;
        
for (i = 0; i < cur->cnt; i++{
            x 
= cur->arr[i].x;
            y 
= cur->arr[i].y;
            t 
= map[x][y];
            
if (!t) {
                
//printf("step %d (%d,%d) %d\n", step, x, y, t);
                return step;
            }

            
if (step + 1 >= t)
                
continue;
            
//printf("step %d (%d,%d) %d\n", step, x, y, t);
            insert(nxt, x - 1, y);
            insert(nxt, x 
+ 1, y);
            insert(nxt, x, y 
+ 1);
            insert(nxt, x, y 
- 1);
        }

    }

}


int  main()
{
    
int m, x, y, t;

    freopen(
"e:\\test\\in.txt""r", stdin);

    scanf(
"%d"&m);
    
while (m--{
        scanf(
"%d%d%d"&x, &y, &t);
        crash(x, y, t);
        crash(x 
+ 1, y, t);
        crash(x 
- 1, y, t);
        crash(x, y 
+ 1, t);
        crash(x, y 
- 1, t);
    }

    printf(
"%d\n", solve());

    
return 0;
}

你可能感兴趣的:(POJ 3669 Meteor Shower 宽搜)