P4872 OIer们的东方梦 92points WA on #11 求调
查看原帖
P4872 OIer们的东方梦 92points WA on #11 求调
305928
zhoumurui楼主2024/4/12 23:34

rt

思路为优先队列bfs

#include<bits/stdc++.h>
using namespace std;
typedef int ll;
char mp[1005][1005];
int d[1005][1005][3][2][2][2];
struct node{
    int x,y,dis,gua,skm[3];//gua=0:空手 gua=1:太阳花 gua=2:楼观剑 skm[i]:gua=i时有没有跑过隙间
};
inline bool operator < (node a,node b){
    return a.dis>b.dis;
}
inline node sett(int x,int y,int dis,int gua,int a,int b,int c){
    node sn;
    sn.x=x,sn.y=y,sn.dis=dis,sn.gua=gua,sn.skm[0]=a,sn.skm[1]=b,sn.skm[2]=c;
    return sn;
}
vector<ll> skmx,skmy;
int main(){
    ll n,m,cnt=0;//紫的隙间数
    cin>>n>>m;
    ll sx,sy,ex,ey;
    for (int i=1;i<=n;i++){
        for (int j=1;j<=m;j++){
            cin>>mp[i][j];
            if (mp[i][j]=='0'||mp[i][j]=='9')mp[i][j]='M';
            if (mp[i][j]=='S'){
                sx=i,sy=j,mp[i][j]='M';
            }
            if (mp[i][j]=='E'){
                ex=i,ey=j,mp[i][j]='M';
            }
            if (mp[i][j]=='X'){
                skmx.push_back(i);
                skmy.push_back(j);
                cnt++;
            }
            
            //麻薯长满幻想乡
        }
    }
    memset(d,0x3f,sizeof(d));
    memset(d[sx][sy],0,sizeof(d[sx][sy]));
    priority_queue<node> q;
    node sn,ne;
    sn=sett(sx,sy,0,0,0,0,0);
    q.push(sn);
    while (!q.empty()){
        sn=q.top();
        //cout<<sn.x<<" "<<sn.y<<" "<<sn.dis<<" "<<sn.gua<<" "<<sn.skm[0]<<" "<<sn.skm[1]<<" "<<sn.skm[2]<<endl;
        q.pop();
        if (sn.x==ex&&sn.y==ey)break;
        if (sn.x>1){
            switch(mp[sn.x-1][sn.y]){
                case 'M':
                    if (d[sn.x-1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x-1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x-1,sn.y,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case '1':
                    if (sn.gua==2&&d[sn.x-1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x-1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x-1,sn.y,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case '2':
                    if (sn.gua>=1&&d[sn.x-1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x-1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x-1,sn.y,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    else if (d[sn.x-1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+4){
                        d[sn.x-1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+4;
                        ne=sett(sn.x-1,sn.y,sn.dis+4,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case '3':
                    if (sn.gua>=1&&d[sn.x-1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x-1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x-1,sn.y,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    else if (d[sn.x-1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+9){
                        d[sn.x-1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+9;
                        ne=sett(sn.x-1,sn.y,sn.dis+9,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case '4':
                    if (d[sn.x-1][sn.y][max(sn.gua,1)][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x-1][sn.y][max(sn.gua,1)][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x-1,sn.y,sn.dis+1,max(sn.gua,1),sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case '5':
                    if (d[sn.x-1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x-1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x-1,sn.y,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    if (d[sn.x-1][sn.y][2][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+6){
                        d[sn.x-1][sn.y][2][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+6;
                        ne=sett(sn.x-1,sn.y,sn.dis+6,2,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case 'X':
                    if (d[sn.x-1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x-1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x-1,sn.y,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    if (sn.gua==0&&sn.skm[0]==0){
                        for (int i=0;i<cnt;i++){
                            if (d[skmx[i]][skmy[i]][sn.gua][1][sn.skm[1]][sn.skm[2]]>sn.dis+2){
                                d[skmx[i]][skmy[i]][sn.gua][1][sn.skm[1]][sn.skm[2]]=sn.dis+2;
                                ne=sett(skmx[i],skmy[i],sn.dis+2,sn.gua,1,sn.skm[1],sn.skm[2]);
                                q.push(ne);
                            }
                        }
                    }
                    if (sn.gua==1&&sn.skm[1]==0){
                        for (int i=0;i<cnt;i++){
                            if (d[skmx[i]][skmy[i]][sn.gua][sn.skm[0]][1][sn.skm[2]]>sn.dis+2){
                                d[skmx[i]][skmy[i]][sn.gua][sn.skm[0]][1][sn.skm[2]]=sn.dis+2;
                                ne=sett(skmx[i],skmy[i],sn.dis+2,sn.gua,sn.skm[0],1,sn.skm[2]);
                                q.push(ne);
                            }
                        }
                    }
                    if (sn.gua==2&&sn.skm[2]==0){
                        for (int i=0;i<cnt;i++){
                            if (d[skmx[i]][skmy[i]][sn.gua][sn.skm[0]][sn.skm[1]][1]>sn.dis+2){
                                d[skmx[i]][skmy[i]][sn.gua][sn.skm[0]][sn.skm[1]][1]=sn.dis+2;
                                ne=sett(skmx[i],skmy[i],sn.dis+2,sn.gua,sn.skm[0],sn.skm[1],1);
                                q.push(ne);
                            }
                        }
                    }
                    break;
            }
        }
        if (sn.x<n){
            switch(mp[sn.x+1][sn.y]){
                case 'M':
                    if (d[sn.x+1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x+1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x+1,sn.y,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case '1':
                    if (sn.gua==2&&d[sn.x+1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x+1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x+1,sn.y,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case '2':
                    if (sn.gua>=1&&d[sn.x+1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x+1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x+1,sn.y,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    else if (d[sn.x+1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+4){
                        d[sn.x+1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+4;
                        ne=sett(sn.x+1,sn.y,sn.dis+4,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case '3':
                    if (sn.gua>=1&&d[sn.x+1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x+1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x+1,sn.y,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    else if (d[sn.x+1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+9){
                        d[sn.x+1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+9;
                        ne=sett(sn.x+1,sn.y,sn.dis+9,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case '4':
                    if (d[sn.x+1][sn.y][max(sn.gua,1)][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x+1][sn.y][max(sn.gua,1)][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x+1,sn.y,sn.dis+1,max(sn.gua,1),sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case '5':
                    if (d[sn.x+1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x+1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x+1,sn.y,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    if (d[sn.x+1][sn.y][2][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+6){
                        d[sn.x+1][sn.y][2][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+6;
                        ne=sett(sn.x+1,sn.y,sn.dis+6,2,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case 'X':
                    if (d[sn.x+1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x+1][sn.y][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x+1,sn.y,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    if (sn.gua==0&&sn.skm[0]==0){
                        for (int i=0;i<cnt;i++){
                            if (d[skmx[i]][skmy[i]][sn.gua][1][sn.skm[1]][sn.skm[2]]>sn.dis+2){
                                d[skmx[i]][skmy[i]][sn.gua][1][sn.skm[1]][sn.skm[2]]=sn.dis+2;
                                ne=sett(skmx[i],skmy[i],sn.dis+2,sn.gua,1,sn.skm[1],sn.skm[2]);
                                q.push(ne);
                            }
                        }
                    }
                    if (sn.gua==1&&sn.skm[1]==0){
                        for (int i=0;i<cnt;i++){
                            if (d[skmx[i]][skmy[i]][sn.gua][sn.skm[0]][1][sn.skm[2]]>sn.dis+2){
                                d[skmx[i]][skmy[i]][sn.gua][sn.skm[0]][1][sn.skm[2]]=sn.dis+2;
                                ne=sett(skmx[i],skmy[i],sn.dis+2,sn.gua,sn.skm[0],1,sn.skm[2]);
                                q.push(ne);
                            }
                        }
                    }
                    if (sn.gua==2&&sn.skm[2]==0){
                        for (int i=0;i<cnt;i++){
                            if (d[skmx[i]][skmy[i]][sn.gua][sn.skm[0]][sn.skm[1]][1]>sn.dis+2){
                                d[skmx[i]][skmy[i]][sn.gua][sn.skm[0]][sn.skm[1]][1]=sn.dis+2;
                                ne=sett(skmx[i],skmy[i],sn.dis+2,sn.gua,sn.skm[0],sn.skm[1],1);
                                q.push(ne);
                            }
                        }
                    }
                    break;
            }
        }
        if (sn.y<m){
            switch(mp[sn.x][sn.y+1]){
                case 'M':
                    if (d[sn.x][sn.y+1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x][sn.y+1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x,sn.y+1,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case '1':
                    if (sn.gua==2&&d[sn.x][sn.y+1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x][sn.y+1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x,sn.y+1,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case '2':
                    if (sn.gua>=1&&d[sn.x][sn.y+1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x][sn.y+1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x,sn.y+1,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    else if (d[sn.x][sn.y+1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+4){
                        d[sn.x][sn.y+1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+4;
                        ne=sett(sn.x,sn.y+1,sn.dis+4,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case '3':
                    if (sn.gua>=1&&d[sn.x][sn.y+1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x][sn.y+1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x,sn.y+1,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    else if (d[sn.x][sn.y+1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+9){
                        d[sn.x][sn.y+1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+9;
                        ne=sett(sn.x,sn.y+1,sn.dis+9,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case '4':
                    if (d[sn.x][sn.y+1][max(sn.gua,1)][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x][sn.y+1][max(sn.gua,1)][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x,sn.y+1,sn.dis+1,max(sn.gua,1),sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case '5':
                    if (d[sn.x][sn.y+1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x][sn.y+1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x,sn.y+1,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    if (d[sn.x][sn.y+1][2][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+6){
                        d[sn.x][sn.y+1][2][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+6;
                        ne=sett(sn.x,sn.y+1,sn.dis+6,2,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case 'X':
                    if (d[sn.x][sn.y+1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x][sn.y+1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x,sn.y+1,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    if (sn.gua==0&&sn.skm[0]==0){
                        for (int i=0;i<cnt;i++){
                            if (d[skmx[i]][skmy[i]][sn.gua][1][sn.skm[1]][sn.skm[2]]>sn.dis+2){
                                d[skmx[i]][skmy[i]][sn.gua][1][sn.skm[1]][sn.skm[2]]=sn.dis+2;
                                ne=sett(skmx[i],skmy[i],sn.dis+2,sn.gua,1,sn.skm[1],sn.skm[2]);
                                q.push(ne);
                            }
                        }
                    }
                    if (sn.gua==1&&sn.skm[1]==0){
                        for (int i=0;i<cnt;i++){
                            if (d[skmx[i]][skmy[i]][sn.gua][sn.skm[0]][1][sn.skm[2]]>sn.dis+2){
                                d[skmx[i]][skmy[i]][sn.gua][sn.skm[0]][1][sn.skm[2]]=sn.dis+2;
                                ne=sett(skmx[i],skmy[i],sn.dis+2,sn.gua,sn.skm[0],1,sn.skm[2]);
                                q.push(ne);
                            }
                        }
                    }
                    if (sn.gua==2&&sn.skm[2]==0){
                        for (int i=0;i<cnt;i++){
                            if (d[skmx[i]][skmy[i]][sn.gua][sn.skm[0]][sn.skm[1]][1]>sn.dis+2){
                                d[skmx[i]][skmy[i]][sn.gua][sn.skm[0]][sn.skm[1]][1]=sn.dis+2;
                                ne=sett(skmx[i],skmy[i],sn.dis+2,sn.gua,sn.skm[0],sn.skm[1],1);
                                q.push(ne);
                            }
                        }
                    }
                    break;
            }
        }
        if (sn.y>1){
            switch(mp[sn.x][sn.y-1]){
                case 'M':
                    if (d[sn.x][sn.y-1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x][sn.y-1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x,sn.y-1,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case '1':
                    if (sn.gua==2&&d[sn.x][sn.y-1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x][sn.y-1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x,sn.y-1,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case '2':
                    if (sn.gua>=1&&d[sn.x][sn.y-1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x][sn.y-1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x,sn.y-1,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    else if (d[sn.x][sn.y-1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+4){
                        d[sn.x][sn.y-1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+4;
                        ne=sett(sn.x,sn.y-1,sn.dis+4,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case '3':
                    if (sn.gua>=1&&d[sn.x][sn.y-1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x][sn.y-1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x,sn.y-1,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    else if (d[sn.x][sn.y-1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+9){
                        d[sn.x][sn.y-1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+9;
                        ne=sett(sn.x,sn.y-1,sn.dis+9,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case '4':
                    if (d[sn.x][sn.y-1][max(sn.gua,1)][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x][sn.y-1][max(sn.gua,1)][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x,sn.y-1,sn.dis+1,max(sn.gua,1),sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case '5':
                    if (d[sn.x][sn.y-1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x][sn.y-1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x,sn.y-1,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    if (d[sn.x][sn.y-1][2][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+6){
                        d[sn.x][sn.y-1][2][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+6;
                        ne=sett(sn.x,sn.y-1,sn.dis+6,2,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    break;
                case 'X':
                    if (d[sn.x][sn.y-1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]>sn.dis+1){
                        d[sn.x][sn.y-1][sn.gua][sn.skm[0]][sn.skm[1]][sn.skm[2]]=sn.dis+1;
                        ne=sett(sn.x,sn.y-1,sn.dis+1,sn.gua,sn.skm[0],sn.skm[1],sn.skm[2]);
                        q.push(ne);
                    }
                    if (sn.gua==0&&sn.skm[0]==0){
                        for (int i=0;i<cnt;i++){
                            if (d[skmx[i]][skmy[i]][sn.gua][1][sn.skm[1]][sn.skm[2]]>sn.dis+2){
                                d[skmx[i]][skmy[i]][sn.gua][1][sn.skm[1]][sn.skm[2]]=sn.dis+2;
                                ne=sett(skmx[i],skmy[i],sn.dis+2,sn.gua,1,sn.skm[1],sn.skm[2]);
                                q.push(ne);
                            }
                        }
                    }
                    if (sn.gua==1&&sn.skm[1]==0){
                        for (int i=0;i<cnt;i++){
                            if (d[skmx[i]][skmy[i]][sn.gua][sn.skm[0]][1][sn.skm[2]]>sn.dis+2){
                                d[skmx[i]][skmy[i]][sn.gua][sn.skm[0]][1][sn.skm[2]]=sn.dis+2;
                                ne=sett(skmx[i],skmy[i],sn.dis+2,sn.gua,sn.skm[0],1,sn.skm[2]);
                                q.push(ne);
                            }
                        }
                    }
                    if (sn.gua==2&&sn.skm[2]==0){
                        for (int i=0;i<cnt;i++){
                            if (d[skmx[i]][skmy[i]][sn.gua][sn.skm[0]][sn.skm[1]][1]>sn.dis+2){
                                d[skmx[i]][skmy[i]][sn.gua][sn.skm[0]][sn.skm[1]][1]=sn.dis+2;
                                ne=sett(skmx[i],skmy[i],sn.dis+2,sn.gua,sn.skm[0],sn.skm[1],1);
                                q.push(ne);
                            }
                        }
                    }
                    break;
            }
        }
    }
    ll ans=0x3f3f3f3f;
    for (int i=0;i<3;i++){
        for (int j=0;j<2;j++){
            for (int k=0;k<2;k++){
                for (int l=0;l<2;l++){
                    ans=min(ans,d[ex][ey][i][j][k][l]);
                }
            }
        }
    }
    if (ans<1e9)cout<<ans<<endl;
    else cout<<"We want to live in the TouHou World forever\n";
    return 0;
}
2024/4/12 23:34
加载中...