题目链接:http://poj.org/problem?id=3669
题目大意:女主牛在起点(0,0),天气预报说今天会下流星雨,女主牛得逃生,流星砸下来它的附近的四个格点的位置都会被毁灭,以后不能再走,女主牛每次可走在地图范围内的四个格点,问女主牛至少得走多少歩才能安全。
分析:这个题目至少,明显是bfs,但又和以前的bfs不一样,唔。。。后来看了别人的结题报告才明白要自己够遭地图,先构建地图,被砸的点及四个相邻格点在时间T以便不能过人了,注意如果有点被多颗流星砸到,那么选时间值最小的,原因么,自己体会,搜索的终点是能否到达一个永远不会被砸到的地方。
另外,自己的题量还是不够啊。
code:
#include<cstdio>
#include<cstring>
#include<queue>
#define min(a,b) (a<b?a:b)
using namespace std;
const int MAXN=305;
const int INF=99999999;
struct node{int x,y,step,time;}s;
int a[MAXN][MAXN],visit[MAXN][MAXN];//visit标记是否已经走过
int dx[5]={0,-1,1,0,0},dy[5]={0,0,0,1,-1};//可以走的五个方向
void bfs(){
queue<node>q;
while(!q.empty())q.pop();
s.x=0,s.y=0,s.step=0,s.time=0;
q.push(s);
while(!q.empty()){
node ne=q.front();q.pop();
for(int i=0;i<5;++i){
node no;
no.x=ne.x+dx[i];
no.y=ne.y+dy[i];
no.step=ne.step;
no.time=ne.time+1;
if(no.x>=0&&no.x<MAXN&&no.y>=0&&no.y<MAXN&&!visit[no.x][no.y]&&no.time<a[no.x][no.y]){//在地图内,点没走过,地图还没被毁
visit[no.x][no.y]=1;
no.step++;
if(a[no.x][no.y]==INF){printf("%d\n",no.step);return;}
q.push(no);
}
}
}
printf("-1\n");//没有找到这样一个地方,打印-1
}
int main(void){
for(int i=0;i<MAXN;++i)
for(int j=0;j<MAXN;++j)
a[i][j]=INF;//初始化假设所有的点永远不会被砸到
memset(visit,0,sizeof(visit));
int M;scanf("%d",&M);
for(int i=0;i<M;++i){
int x,y,t;
scanf("%d%d%d",&x,&y,&t);
for(int i=0;i<5;++i){
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0&&nx<MAXN&&ny>=0&&ny<MAXN)
a[nx][ny]=min(a[nx][ny],t);
}
}//构图
bfs();
}