刷题——Meteor Shower POJ - 3669
2017-08-14 10:15
204 查看
/*
给定撞击点和撞击时间
求从0,0点开始到到达为摧毁地点的最小时间,若无法到达安全地点则输出-1
被撞击点的上下左右中五个点都会被摧毁
设为被撞击的点为-1,被撞击点设为最早被撞击时间
从0,0开始遍历,找到最快到达的-1点
*/
#include <stdio.h>
#include <string.h>
#include <queue>
#include <iostream>
using namespace std;
typedef pair<int,int>P;
int a[305][305];
int dx[]={0,1,0,-1,0};
int dy[]={1,0,-1,0,0};
bool vis[305][305];
int d[305][305];
void zj(int x,int y,int t){
if(x>=0&&y>=0){
if(a[x][y]==-1){
a[x][y]=t;
}
else if(a[x][y]>t){
a[x][y]=t;
}
}
}
void bfs(){
queue<P>que;
que.push(P(0,0));
memset(vis,false,sizeof(vis));
memset(d,0,sizeof(d));
vis[0][0]=true;
while(!que.empty()){
P p=que.front();
que.pop();
int x=p.first;
int y=p.second;
if(a[x][y]==-1){
printf("%d\n",d[x][y]);
return;
}
for(int i=0;i<4;i++){
int tx=x+dx[i];
int ty=y+dy[i];
if(tx>=0&&ty>=0&&!vis[tx][ty]&&(d[x][y]+1<a[tx][ty]||a[tx][ty]==-1)){
que.push(P(tx,ty));
vis[tx][ty]=true;
d[tx][ty]=d[x][y]+1;
}
}
}
printf("-1\n");
}
int main(){
int n;
while(~scanf("%d",&n)){
memset(a,-1,sizeof(a));
int x,y,t;
for(int i=0;i<n;i++){
scanf("%d %d %d",&x,&y,&t);
for(int j=0;j<5;j++)
zj(x+dx[j],y+dy[j],t);
}
bfs();
}
return 0;
}
给定撞击点和撞击时间
求从0,0点开始到到达为摧毁地点的最小时间,若无法到达安全地点则输出-1
被撞击点的上下左右中五个点都会被摧毁
设为被撞击的点为-1,被撞击点设为最早被撞击时间
从0,0开始遍历,找到最快到达的-1点
*/
#include <stdio.h>
#include <string.h>
#include <queue>
#include <iostream>
using namespace std;
typedef pair<int,int>P;
int a[305][305];
int dx[]={0,1,0,-1,0};
int dy[]={1,0,-1,0,0};
bool vis[305][305];
int d[305][305];
void zj(int x,int y,int t){
if(x>=0&&y>=0){
if(a[x][y]==-1){
a[x][y]=t;
}
else if(a[x][y]>t){
a[x][y]=t;
}
}
}
void bfs(){
queue<P>que;
que.push(P(0,0));
memset(vis,false,sizeof(vis));
memset(d,0,sizeof(d));
vis[0][0]=true;
while(!que.empty()){
P p=que.front();
que.pop();
int x=p.first;
int y=p.second;
if(a[x][y]==-1){
printf("%d\n",d[x][y]);
return;
}
for(int i=0;i<4;i++){
int tx=x+dx[i];
int ty=y+dy[i];
if(tx>=0&&ty>=0&&!vis[tx][ty]&&(d[x][y]+1<a[tx][ty]||a[tx][ty]==-1)){
que.push(P(tx,ty));
vis[tx][ty]=true;
d[tx][ty]=d[x][y]+1;
}
}
}
printf("-1\n");
}
int main(){
int n;
while(~scanf("%d",&n)){
memset(a,-1,sizeof(a));
int x,y,t;
for(int i=0;i<n;i++){
scanf("%d %d %d",&x,&y,&t);
for(int j=0;j<5;j++)
zj(x+dx[j],y+dy[j],t);
}
bfs();
}
return 0;
}
相关文章推荐
- Meteor Shower POJ - 3669
- Meteor Shower POJ - 3669 广搜
- D - Meteor Shower POJ - 3669
- Meteor Shower POJ - 3669
- Meteor Shower POJ - 3669
- Meteor Shower POJ - 3669 广搜
- POJ-3669 Meteor Shower BFS
- Meteor Shower POJ - 3669
- Meteor Shower POJ - 3669
- Meteor Shower POJ - 3669-BFS
- AYIT2017暑假集训第二周周三赛 D - Meteor Shower POJ - 3669
- 刷题——Meteor Shower POJ - 3669
- POJ Meteor Shower(BFS)
- POJ 3669 Meteor Shower
- 广搜最短路(最短时间到达目的地),POJ(3669)
- POJ-3669 Meteor Shower(bfs)
- poj 3669 BFS
- POJ 3669 Meteor Shower
- poj之旅——3669
- POJ-3669广度优先搜索