糯米

TI DaVinci, gstreamer, ffmpeg
随笔 - 167, 文章 - 0, 评论 - 47, 引用 - 0
数据加载中……

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;
}

posted on 2010-02-14 21:08 糯米 阅读(1353) 评论(0)  编辑 收藏 引用 所属分类: POJ


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理