第一道题的代码进入poj的前40,嘚瑟一下~~~~~。
题目大意:给你流星的坠落时间和坐标,每个流星坠落时会把它坐标的上下左右和本身的坐标给摧毁掉,也就是说在这个时间点之后当前坐标是不可被访问的,题目要求的是是否能走到一个点永远也不会被流星砸中,若有输出走到该点最小时间,若没有输出-1。可能要注意的就是直接被砸死的这种情况,还有好像后台数据大于题目的限制范围
裸裸的bfs,不过之前RE到死,之后不知道改了啥居然就过了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
#define INF 100000
typedef pair<int,int> P;
int Map[405][405];
int maze[405][405];
int M;
int dx[5]= {0,0,0,1,-1};
int dy[5]= {0,1,-1,0,0};
int cnt;
void deal(int x,int y,int t)
{
for(int i=0; i<5; i++)
{
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0&&ny>=0)
{
Map[nx][ny]=min(t,Map[nx][ny]);
}
}
}
void bfs()
{
queue <P> q;
maze[0][0]=0;
q.push(P(0,0));
while(!q.empty())
{
P p=q.front();
if(Map[p.first][p.second]==INF)
{
printf("%d\n",maze[p.first][p.second]);
break;
}
q.pop();
for(int i=1; i<5; i++)
{
int nx=p.first+dx[i],ny=p.second+dy[i];
if(nx>=0&&ny>=0&&maze[p.first][p.second]+1<Map[nx][ny]
&&maze[nx][ny]>maze[p.first][p.second]+1)
{
q.push(P(nx,ny));
maze[nx][ny]=maze[p.first][p.second]+1;
}
}
}
if(q.empty())
printf("-1\n");
}
int main()
{
while(scanf("%d",&M)==1)
{
for(int i=0; i<=401; i++)
{
for(int j=0; j<=401; j++)
{
Map[i][j]=maze[i][j]=INF;
}
}
int x,y,t;
for(int i=1; i<=M; i++)
{
scanf("%d%d%d",&x,&y,&t);
deal(x,y,t);
}
if(Map[0][0]==0)
{
printf("-1\n");
}
else
{
bfs();
}
}
return 0;
}