洛谷:P2895 [USACO08FEB]Meteor Shower S(bfs,)

题目:

洛谷:P2895 [USACO08FEB]Meteor Shower S(bfs,)_第1张图片

分析:与时间有关的变化图,没有任何的思路。只能想到暴力搜:

看题解,自己思维的错误点在于:即使有时间点的影响,也不可能重复到达其他的点。

代码:

#include
using namespace std;
int A[605][605];
int D1[5]={0,-1,1,0,0}; 
int D2[5]={0,0,0,-1,1};
void f(int x,int y,int c)
{
 if(x<0) return;
 if(y<0) return;
 if(A[x][y]==-1){
  A[x][y]=c;return ;
 }
 A[x][y]=min(A[x][y],c);
}
int main()
{
 memset(A,-1,sizeof(A));
 int m;
 cin>>m;
 for(int i=0;i<m;i++)
 {
  int a,b,c;
  cin>>a>>b>>c;
  for(int j=0;j<5;j++) f(a+D1[j],b+D2[j],c);
 }
 int t=0;
 pair<int,int> p;
 p.first=0;
 p.second=0;
 queue<pair<int,int> > qp;
 qp.push(p);
 while(!qp.empty())
 {
  t++;
  queue<pair<int,int> > qp2;
  while(!qp.empty())
  {
   pair<int,int> p2=qp.front();
   qp.pop();
   for(int i=1;i<=4;i++)
   {
    int x=p2.first+D1[i];
    int y=p2.second+D2[i];
    if(x<0||y<0) continue;
    if(A[x][y]==-2) continue;
    if(A[x][y]!=-1 && A[x][y]<=t) continue;
    if(A[x][y]==-1)
    {
     cout<<t;
     exit(0);
    }
    A[x][y]=-2;
    pair<int,int> p3;
    p3.first=x;
    p3.second=y;
    //cout<
    qp2.push(p3);
   }
  }
  qp=qp2;
 }
 cout<<-1;
} 

你可能感兴趣的:(广搜)