Problem:
Rubik Dungeon

Problem

あなたはn × n × nの立方体のルービックキューブ型のダンジョンにやってきた。

あなたは現在(x1,y1,z1)の部屋にいる。

目標の宝は(x2,y2,z2)の部屋にある。

あなたは隣接している前後左右上下の部屋に単位時間で移動することができる。

各部屋には6つのボタンがあり、それぞれのボタンを押すことにより、単位時間で、ルービックキューブのように以下の操作を行うことができる：

現在いる部屋とx座標の値が同じ全ての部屋を時計または反時計周りに90度回転することができる

現在いる部屋とy座標の値が同じ全ての部屋を時計または反時計周りに90度回転することができる

現在いる部屋とz座標の値が同じ全ての部屋を時計または反時計周りに90度回転することができる

回転している途中で他の部屋に移動することはできない。

宝のある部屋まで最短で移動した場合の時間を求めよ。

Input

n
x1 y1 z1
x2 y2 z2

入力は全て整数で与えられる。

1行目にnが与えられる。

2行目に現在地の座標(x1,y1,z1)、3行目に宝のある部屋の座標(x2,y2,z2)が空白区切りで与えられる。

Constraints

2 ≤ n ≤ 105

0 ≤ x1,y1,z1,x2,y2,z2 ≤ n−1

(x1,y1,z1) ≠ (x2,y2,z2)

Output

最短の時間を出力せよ。

Sample Input 1

3
0 0 0
1 2 2

Sample Output 1

3

Sample Input 2

3
0 0 0
0 0 2

Sample Output 2

2

回転させると宝も移動してしまうので、回転させずに移動する。

Solution in C (judge verdict: Accepted)

#include<stdio.h>
#define M 1000000
int MIN(int a,int b){return a<b?a:b;}
int n,r=1,x[M],y[M],z[M],bv[M],gx,gy,gz,min,m[M]={0};
int f(int a,int b,int c,int d,int e){
  x[r]=a;
  y[r]=b;
  z[r]=c;
  bv[r]=d;
  m[r]=e;
  r++;
  //printf("%d %d %d %d\n",a,b,c,m[r-1]);
  //l=abs(a-gx)+abs(b-gy)+abs(c-gz);
  min=MIN(min,m[r-1]+abs(a-gx)+abs(b-gy)+abs(c-gz));
}
int main(){
  int t;
  scanf("%d",&n);
  scanf("%d %d %d %d %d %d",&x[0],&y[0],&z[0],&gx,&gy,&gz);
  bv[0]=9;
  m[0]=0;
  min=abs(x[0]-gx)+abs(y[0]-gy)+abs(z[0]-gz);//printf("min:%d\n",min);
  /*if(x[0]<n-1)f(x[0]+1,y[0]  ,z[0]  ,9,1);
  if(x[0]>0  )f(x[0]-1,y[0]  ,z[0]  ,9,1);
  if(y[0]<n-1)f(x[0]  ,y[0]+1,z[0]  ,9,1);
  if(y[0]>0  )f(x[0]  ,y[0]-1,z[0]  ,9,1);
  if(z[0]<n-1)f(x[0]  ,y[0]  ,z[0]+1,9,1);
  if(z[0]>0  )f(x[0]  ,y[0]  ,z[0]-1,9,1);//*/
  for(t=0;r<M-20;t++){
    if(x[t]<n-1)f(x[t]+1,y[t]  ,z[t]  ,9,m[t]+1);
    if(x[t]>0  )f(x[t]-1,y[t]  ,z[t]  ,9,m[t]+1);
    if(y[t]<n-1)f(x[t]  ,y[t]+1,z[t]  ,9,m[t]+1);
    if(y[t]>0  )f(x[t]  ,y[t]-1,z[t]  ,9,m[t]+1);
    if(z[t]<n-1)f(x[t]  ,y[t]  ,z[t]+1,9,m[t]+1);
    if(z[t]>0  )f(x[t]  ,y[t]  ,z[t]-1,9,m[t]+1);
    if(bv[t]-0&&gx-x[t])f(    x[t],    z[t],n-1-y[t],0,m[t]+1);//xto
    if(bv[t]-1&&gx-x[t])f(    x[t],n-1-z[t],    y[t],1,m[t]+1);//xhan
    if(bv[t]-2&&gx-x[t])f(    x[t],n-1-y[t],n-1-z[t],2,m[t]+2);//xw
    if(bv[t]-3&&gy-y[t])f(    z[t],    y[t],n-1-x[t],3,m[t]+1);//yto
    if(bv[t]-4&&gy-y[t])f(n-1-z[t],    y[t],    x[t],4,m[t]+1);//yhan
    if(bv[t]-5&&gy-y[t])f(n-1-x[t],    y[t],n-1-z[t],5,m[t]+2);//yw
    if(bv[t]-6&&gz-z[t])f(    y[t],n-1-x[t],    z[t],6,m[t]+1);//zto
    if(bv[t]-7&&gz-z[t])f(n-1-y[t],    x[t],    z[t],7,m[t]+1);//zhan
    if(bv[t]-8&&gz-z[t])f(n-1-x[t],n-1-y[t],    z[t],8,m[t]+2);//zw
  }
  printf("%d\n",min);
  return 0;
}