85分求助。

P2895 [USACO08FEB] Meteor Shower S

Mithrandir @ 2020-07-21 17:55:05

#include <iostream>
#include <algorithm>
#include <math.h>
#include <queue>
#pragma GCC optimize(2)
using namespace std;
struct Meteor
{
    int x,y;
    int t;
}s;
int m,mapp[305][305]={},cx,cy,ct;
int mx[5]={0,1,0,-1,0};
int my[5]={0,0,1,0,-1};
deque <Meteor> q;
int bfs()
{
    while(!q.empty())
    {
        for(int i=1;i<=4;i++)
        {
            Meteor n;
            n.x=q.front().x+mx[i];
            n.y=q.front().y+my[i];
            n.t=q.front().t+1;
            if(mapp[n.x][n.y]==0&&n.x<=300&&n.y<=300&&n.x>=0&&n.y>=0) return n.t;
            if(n.x<=300&&n.y<=300&&n.x>=0&&n.y>=0&&n.t<mapp[n.x][n.y]&&mapp[n.x][n.y]!=-1)
            q.push_back(n),mapp[n.x][n.y]=-1;
        }
        q.pop_front();
    }
    return -1;
}
int main()
{
    cin>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>cx>>cy>>ct;
        if(mapp[cx][cy]>ct||!mapp[cx][cy]) mapp[cx][cy]=ct;
        for(int j=1;j<=4;j++)
        if(mapp[cx+mx[j]][cy+my[j]]>ct&&cx+mx[j]>=0&&cy+my[j]>=0||!mapp[cx+mx[j]][cy+my[j]]&&cx+mx[j]>=0&&cy+my[j]>=0)
        mapp[cx+mx[j]][cy+my[j]]=ct;
    }
    /*for(int i=0;i<30;i++)
    {
        for(int j=0;j<30;j++)
        cout<<mapp[i][j]<<" ";
        cout<<endl;
    }*/
    s.t=0;s.x=0;s.y=0;
    q.push_back(s);
    cout<<bfs();
    return 0;
}

我比较好奇第3个点:

in

5

0 0 2

3 0 0

1 2 5

2 2 4

1 4 4

map

2 2 5 0 4 0 0

2 5 4 4 4 4 0

0 4 4 4 4 0 0

0 0 4 0 0 0 0

0 0 0 0 0 0 0

myout 2

answer 3


by konjacq @ 2020-07-21 18:40:37

您地图画错了,应该是

2 2 5 . 4 . .
0 5 4 4 4 4 .
0 0 4 4 4 . .
0 . 4 . . . .
. . . . . . .

其中.表示砸不到,您没有考虑T_i=0的情况


by Mithrandir @ 2020-07-25 18:05:02

@konjacq 哦!谢谢提醒,我才发现用0代表砸不到是不行的。


by Mithrandir @ 2020-07-25 18:11:56

结贴。


|