AtCoder Beginner Contest 176 D-Wizard in Maze(bfs)

题目链接


题目大意:

一个H×W大小的矩阵,其中'.'代表路,'#'代表墙壁,有两种移动方式一是沿着路一格一格走,二是以当前格为中心,走到5×5正方形中的任何一个路,问你从出发地到目的地至少要用第二种方式走几步?

解题思路:

abc的场E比D简单多了,这题花了我好久的时间才写出来主要就是麻烦,分两次BFS,一次是第一种方式,一次是第二种方式。

代码:

// #include<bits/stdc++.h>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#define pb emplace_back
#define LOCAL
  
using namespace std;
  
const int mod = 1e9+7;
const int inf = 0x3f3f3f3f;
const int maxn = 1e5+5;
typedef long long ll;
typedef pair<int,int> Pii;
 
template <typename T>inline void read(T& t){
    char c=getchar();t=0;
    int f=1;
    while(!isdigit(c)){
       if(c=='-')f=-1;
        c=getchar();
    }
    while(isdigit(c))t=t*10+c-48,c=getchar();
    t=f*t;
}
  
template <typename T,typename... Args> inline void read(T& t,Args&... args){
    read(t);read(args...);
}

char maze[1005][1005];
int vis[1005][1005];
int c1,c2,d1,d2;
queue<Pii> q[2];//q[0]代表第一种方式,q[2]代表第二种方式
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
 
int main(){
    int t=1;
    // read(t);
    while(t--){
        int h,w;
        read(h,w);
        read(c1,c2,d1,d2);
        for(int i=0;i<=h+1;i++){
            for(int j=0;j<=w+1;j++){
                maze[i][j]='#';
            }
        }
        for(int i=1;i<=h;i++){
            scanf("%s",maze[i]+1);
        }
        bool flag=true;
        vis[c1][c2]=1;
        int x=0,ans=0;//ans代表第二种次数
        q[x].push(Pii(c1,c2));
        while(1){
            while(!q[x].empty()){
                Pii now=q[x].front();
                q[x^1].push(now);
                q[x].pop();
                for(int i=0;i<4;i++){
                    int tx=now.first+dx[i];
                    int ty=now.second+dy[i];
                    if(!vis[tx][ty]&&maze[tx][ty]=='.'){
                        q[x].push(Pii(tx,ty));
                        q[x^1].push(Pii(tx,ty));
                        vis[tx][ty]=1;
                    }
                }
            }
            if(vis[d1][d2]){
                break;
            }
            x^=1;
            ans++;
            while(q[x].size()){
                Pii now=q[x].front();
                q[x].pop();
                for(int i=-2;i<=2;i++){
                    for(int j=-2;j<=2;j++){
                        int tx=now.first+i;
                        int ty=now.second+j;
                        if(tx<0||tx>h)continue;
                        if(ty<0||ty>w)continue;
                        if(!vis[tx][ty]&&maze[tx][ty]=='.'){
                            q[x^1].push(Pii(tx,ty));
                            vis[tx][ty]=1;
                        }
                    }
                }
            }
            if(vis[d1][d2]){
                break;
            }
            x^=1;
            if(q[x].empty()){
                flag=false;
                break;
            }
        }
        if(!flag){
            puts("-1");
            break;
        }
        printf("%d\n",ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值