[ABC176D] Wizard in Maze

题目链接:https://atcoder.jp/contests/abc176/tasks/abc176_d

双端队列bfs模版题.

众所周知,用队列实现bfs,队列中存的是当前的状态

那么在当前这种题目中,下一步怎么走有两种决策,我们要把两种决策可能导致的状态更新全部都记录下来,因此我们可以用双端队列来实现bfs,把正常走的和传送的分别放入双端队列的前后端进行bfs即可,注意不同的决策对状态更新影响,然后分类讨论更新状态即可.

int n,m;
struct node{
    int x,y,step;
};
int stx,sty;
int edx,edy;
#define maxn 1010
char a[maxn][maxn];
bool check(int x,int y)
{
    if(x<=0||x>n||y<=0||y>m||a[x][y]=='#')
    {
        return true;
    }
    return false;
}
deque<node> que;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int dis[maxn][maxn];
void bfs()
{
    que.push_front({stx,sty,0});
    dis[stx][sty]=0;
    while(!que.empty())
    {
        auto k=que.front();
        que.pop_front();
        int x=k.x,y=k.y;
        int t=k.step;
        for(int i=0;i<4;i++)
        {
            int dx=x+dir[i][0];
            int dy=y+dir[i][1];
            if(check(dx,dy)||dis[dx][dy]<=dis[x][y]) continue;
            que.push_front({dx,dy,t});
            dis[dx][dy]=t;
        }
        for(int dx=x-2;dx<=x+2;dx++)
        {
            for(int dy=y-2;dy<=y+2;dy++)
            {
                if(check(dx,dy)||dis[dx][dy]<=dis[x][y]+1)
                {
                    continue;
                }
                que.push_back({dx,dy,t+1});
                dis[dx][dy]=t+1;
            }
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    cin>>stx>>sty;
    cin>>edx>>edy;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>a[i][j];
        }
    }
    memset(dis,0x3f,sizeof(dis));
    bfs();
    if(dis[edx][edy]==0x3f3f3f3f)
    {
        cout<<-1<<'\n';
    }
    else 
    {
        cout<<dis[edx][edy]<<'\n';
    }

}
posted @ 2024-06-07 10:25  Captainfly19  阅读(6)  评论(0编辑  收藏  举报