poj Meteor Shower

這道題是下流星,流星會下到上下左右中的位置,並且有時間的,要你求出最短到達安全位置的時間。安全

這道題要注意邊界是能夠超過300的spa

#include<stdio.h> #include<algorithm> #include<queue> #include<string.h> using namespace std; typedef pair<int,int> P; #define INF 0x3f3f3f3f queue<P>q; int dx[]={1,0,-1,0},dy[]={0,1,0,-1}; int d[306][306]; int dd[306][306]; int gx,gy; int flag=0; int dfs() { memset(dd,INF,sizeof(dd)); q.push(P(0,0)); dd[0][0]=0; while(q.size()) { P p=q.front();q.pop(); if(d[p.first][p.second]==INF){ gx=p.first; gy=p.second; flag=1; break; } for(int i=0;i<4;i++) { int nx=p.first+dx[i],ny=p.second+dy[i]; if(0<=nx&&nx<=305&&0<=ny&&ny<=305&&dd[nx][ny]==INF) {//printf("%d %d %d\n",nx,ny,d[nx][ny]); dd[nx][ny]=dd[p.first][p.second]+1; if(dd[nx][ny]<d[nx][ny]) q.push(P(nx,ny)); } } } if(flag) return dd[gx][gy]; else return -1; } int main() { int m,x,y,t,n; scanf("%d",&n); memset(d,INF,sizeof(d)); for(int i=0;i<n;i++) { scanf("%d %d %d",&x,&y,&t); d[x][y]=min(d[x][y],t); for(int i=0;i<4;i++) { int nx=x+dx[i],ny=y+dy[i]; if(0<=nx&&nx<=305&&0<=ny&&ny<=305) d[nx][ny]=min(d[nx][ny],t); } } int res=dfs(); printf("%d\n",res); }
相關文章
相關標籤/搜索