AtCoder Beginner Contest 176 D.Wizard in Maze

AtCoder Beginner Contest 176 D.Wizard in Maze

题目链接

AtCoder Beginner Contest 176 D.Wizard in Maze_第1张图片
要考试了,上午抽空写波题解,这题我觉得比 E 难,首先两种方案,如果不考虑最优走法,要求最少次数只能 DFS,看题目的数据肯定 T 飞,所以只能 BFS,那么怎么才能最优呢,显然要先走第一种方案,第一种方案走不下去再走第二种方案,重复上述过程即可,那怎么实现呢?可以写两个 BFS,嵌套两个 while 循环即可,AC代码如下:

#include
using namespace std;
typedef long long ll;
const int N=1e3+5;
int n,m,s1,e1,s2,e2,vis[N][N]={0},vis2[N][N]={0},c[N][N]={0},mo[4][2]={1,0,-1,0,0,1,0,-1};
char s[N][N];
struct node{
    int x,y;
};

int bfs(){
    queue<node>q1,q2;
    node a,b;
    a.x=s1,a.y=e1;
    vis[a.x][a.y]=1;
    q1.push(a);
    while(!q1.empty()||!q2.empty()){
        while(!q1.empty()){//先用第一种方法
            a=q1.front();
            q1.pop();
            if(a.x==s2&&a.y==e2){
                return c[a.x][a.y];
            }
            for(int i=0;i<4;i++){
                b.x=a.x+mo[i][0],b.y=a.y+mo[i][1];
                int flag=0;
                if(!vis[b.x][b.y]&&b.x>=0&&b.x<n&&b.y>=0&&b.y<m&&s[b.x][b.y]!='#'){
                    flag=1;
                    vis[b.x][b.y]=1;
                    c[b.x][b.y]=c[a.x][a.y];
                    q1.push(b);
                }
                if(!flag) q2.push(a);
            }
        }
        while(!q2.empty()){//第一种方法走不了再用第二种方法
            a=q2.front();
            q2.pop();
            for(int i=-2;i<=2;i++){
                for(int j=-2;j<=2;j++){
                    if(abs(i)+abs(j)>=2){
                        b.x=a.x+i,b.y=a.y+j;
                        if(!vis[b.x][b.y]&&b.x>=0&&b.x<n&&b.y>=0&&b.y<m&&s[b.x][b.y]!='#'){
                            vis[b.x][b.y]=1;
                            c[b.x][b.y]=c[a.x][a.y]+1;
                            q1.push(b);
                        }
                    }
                }
            }
        }
    }
    return -1;
}

int main(){
    cin>>n>>m>>s1>>e1>>s2>>e2;
    s1--,s2--,e1--,e2--;
    for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>s[i][j];
    cout<<bfs();
}

你可能感兴趣的:(AtCoder,BFS,思维)