您的位置:首页 > 编程语言 > C语言/C++

POJ 3669:Meteor Shower 处处是坑的广搜

2017-07-04 10:23 435 查看
题目链接: POJ—3669

用了两个图,met记录流星最早砸下来的时间,in记录人活着的时间

我注意了一开始会死,但按照 t = 1 算的,结果t是可以为0的。。。

还有几个坑:

1、安全区可以到301

2、同一个点可以炸两次

3、必须在第一象限

4、可以一开始就死,也可以一开始就是安全区

贴上丑丑的代码

/*************************************
Problem: 3669       User: ChenyangDu
Memory: 1928K       Time: 110MS
Language: G++       Result: Accepted
**************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>

using namespace std;

const int map[2][5] = {1,0,0,-1,0,0,1,-1,0,0};
int m,met[400][400],in[400][400],max_t;

struct node{int x,y;};
node Node(int x,int y){
node r;
r.x = x;
r.y = y;
return r;
}
queue <node> que;

void input(){
scanf("%d",&m);
int x,y,t;
for(int i=0;i<m;i++){
scanf("%d%d%d",&x,&y,&t);
for(int i=0;i<5;i++){
int a = map[0][i] + x;
int b = map[1][i] + y;
if(a>=0 && b>=0){
if(met[a][b]>-1)
met[a][b] = min(t,met[a][b]);
else met[a][b] = t;
}

}
max_t = max(max_t,t);
}
}

int main(){
//freopen("in.txt","r",stdin);
memset(met,-1,sizeof(met));
input();
if(met[0][0] == -1){cout<<"0\n"<<endl;return 0;}
que.push(Node(0,0));
for(int k=0;k<=max_t;k++){
node t = que.front();

while(1){
if(que.empty() || in[t.x][t.y]>k)break;

for(int i=0;i<4;i++){
int a = t.x + map[0][i];
int b = t.y + map[1][i];
if(a>=0 && b>=0 && in[a][b] == 0 && (met[a][b]>k+1 || met[a][b] == -1)){
in[a][b] = k+1;
que.push(Node(a,b));
}
}
que.pop();
t = que.front();
}
}
int ans = 0x7fffffff;
for(int i=0;i<=350;i++){
for(int j=0;j<=350;j++){
if(met[i][j] == -1 && in[i][j]>0)
ans = min(ans,in[i][j]);
}
}
if(ans == 0x7fffffff)printf("-1\n");
else printf("%d\n",ans);
fclose(stdin);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj c++ 广度优先