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;
}