【题链接】点击打开链接

【题意】一个迷宫,每个位置都有一个字符,除了*(这个代表墙,不能通过)其他的字符都代表了一种性质,在这种字符上下一步能走到哪些方向。然后还有一种操作是花费1s的时间来旋转这个矩阵(旋转90度)!让矩阵里面的每个字符旋转到对应的字符。然后给出了一个人的初始位置和目的地位置,问你这个人能不能走到目的位置,如果能,输出走到目的位置的最短时间。如果不能的话,输出-1.

【分析】去掉这个旋转操作,这就是一个基本的bfs迷宫模型,有了旋转90度之后,就是相当于多了3个同等的矩阵,只需要考虑加个维度就能解决这个问题啦!具体实现就看我的代码啦。

【吐槽】写了好久,写了130+行,看第一名的代码大概50行,这难道就是智障型选手和菊苣的天壤之别吗?

【AC代码】

//Cloud , you are ky sunshine!
//I can't live without you!
//You are the kost beautiful girl in the world!
#include <bits/stdc++.h>
using namespace std;
const int maxn=1010;
char maze[4][maxn][maxn];
int  vis[4][maxn][maxn];
int  dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//UDLR
int  n,m,sx,sy,ex,ey;
int  rot[maxn];
struct node{
    int x,y,num;
    int mod;//标记在哪一个图
    node(){}
    node(int x,int y,int num,int mod):x(x),y(y),num(num),mod(mod){}
};
//旋转90度
void Rotate(){
    rot['+']='+';
    rot['-']='|';
    rot['|']='-';
    rot['^']='>';
    rot['>']='v';
    rot['<']='^';
    rot['v']='<';
    rot['L']='U';
    rot['U']='R';
    rot['R']='D';
    rot['D']='L';
}
//判断两个点走到
bool ok_l(char c){
    if(c=='+'||c=='-'||c=='<'||c=='R'||c=='U'||c=='D') return true;
    return false;
}
bool ok_r(char c){
    if(c=='+'||c=='-'||c=='>'||c=='L'||c=='U'||c=='D') return true;
    return false;
}
bool ok_u(char c){
    if(c=='+'||c=='|'||c=='^'||c=='L'||c=='R'||c=='D') return true;
    return false;
}
bool ok_d(char c){
    if(c=='+'||c=='|'||c=='v'||c=='L'||c=='R'||c=='U') return true;
    return false;
}
bool legal(int x,int y){
    if(x>=0&&x<n&&y>=0&&y<m) return true;
    return false;
}
bool ok(node now,node nxt,int t,int op){
    char a=maze[t][now.x][now.y],b=maze[t][nxt.x][nxt.y];
    if(op==0){
        if(ok_u(a)&&ok_d(b)) return true;
        return false;
    }
    else if(op==1){
        if(ok_d(a)&&ok_u(b)) return true;
        return false;
    }
    else if(op==2){
        if(ok_l(a)&&ok_r(b)) return true;
        return false;
    }
    else if(op==3){
        if(ok_l(b)&&ok_r(a)) return true;
        return false;
    }
    else{
        return false;
    }
}

int bfs(){
    queue<node>que;
    memset(vis,0,sizeof(vis));
    node now,nxt;
    now.x=sx,now.y=sy;
    now.mod=0,now.num=0;
    que.push(now);
    vis[0][sx][sy]=1;
    while(!que.empty()){
        now=que.front();
        que.pop();
        if(now.x==ex&&now.y==ey){
            cout<<now.num<<endl;
            return 1;
        }
        if(!vis[(now.mod+1)%4][now.x][now.y]){
            que.push(node(now.x,now.y,now.num+1,(now.mod+1)%4));
            vis[(now.mod+1)%4][now.x][now.y]=1;
        }
        for(int i=0; i<4; i++){
            nxt=now;
            nxt.num=now.num+1;
            nxt.x=now.x+dir[i][0];
            nxt.y=now.y+dir[i][1];
            if(maze[nxt.mod][nxt.x][nxt.y]=='*')    continue;
            if(vis[nxt.mod][nxt.x][nxt.y]) continue;
            if(!legal(nxt.x,nxt.y))        continue;
            if(!ok(now,nxt,now.mod,i))     continue;
            que.push(nxt);
            vis[nxt.mod][nxt.x][nxt.y]=true;
        }
    }
    return 0;
}
int main(){
    Rotate();
    cin>>n>>m;
    for(int i=0; i<n; i++) cin>>maze[0][i];
    for(int k=1; k<4; k++){
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                maze[k][i][j]=rot[maze[k-1][i][j]];
            }
        }
    }
    cin>>sx>>sy;
    cin>>ex>>ey;
    sx--,sy--;
    ex--,ey--;
    //cout<<sx<<" "<<sy<<" "<<ex<<" "<<ey<<endl;
    if(sx==ex&&sy==ey){
        puts("0");
        return 0;
    }
    else{
//        int ans=bfs()
        if(!bfs()){
            puts("-1");
        }
    }
    return 0;
}