9連環の攻略法

キューブ王 海永

9連環とは以下のようなもの。

正式には9個の輪が絡んでいるが、ここでは100円の5連環をしめした。左の形を右の形にするのがパズルの課題。なお、右の細長い輪は上に持ち上げられて、2つは分離できる。

 以下の課題もありうる。

左の形を右にするもの。以降、まずは2番目の方を解くものとして説明する。

その前に、デフォルメ形を示しておく。右がデフォルメ形。

 

[攻略法(抽象論)]

抽象論(再帰呼び出し)の攻略法を説明する。具体論は後述。

外す方向で説明する。以下の図に従えばいい。

左の図の、最右の位置にある細長い輪が初期の配置。これを左端の位置に持ってくる操作()H5と呼ぼう矢印に従い、細長い輪を5の輪に通し、外れた位置(左端)にもってくる(u5。しかし、細長い輪は5の輪と絡んでいて外れるわけではない。次にH4^という未定義の操作があったとして4の輪の下に長い輪の先端を持ってくる。以上、左図。

この状態、実は、5の輪を下に落とせる。そこで落とす(d5)

5の輪を下に落とした状態を眺めれば、この状態、輪が1つ減った同じ問題H4だと納得できる。また、H4^という未定義だった操作はH4の逆だと納得できる。以上を総合して、

  H5 = u5* H4^ d5* H4

従って、解法は以下のようになる。

  H5 = u5* H4^ *d5* H4

  H4 = u4* H3^ *d4* H3

  H3 = u3* H2^ *d3* H2

  H2 = u2*     *d2

なお、1番目の問題は以上から自動的に導かれる。入れる方向で説明する。2番目の問題の初期状態を作る。次に外していくのだが、d5,d4,..を省いた操作とする。すると1番目の問題の初期状態になる。

 

[攻略法(具体論)]

上の攻略法は、抽象論で具体的な操作系列につながらない。ここで具体的な操作系列を示す。4連環を入れていく方向。ただし途中まで。

まず、H4^を具体的に展開したものが以下。

H4^ = d2^ u2^ d3^ u2 d2 u3^ d4^ u3 d2^ u2^ d3 u2 d2 u4^

従って、以下の図に従えばいい。

最初、3,4は下に沈んでいる()。まず、d2^。これで中の図になる。つぎにu2^。これで右図になる。つぎにd3^

左の図になる。次にu2。中の図になる。次にd2。右図になる。次にu3^

左の図になる。次にd4。中の図になる。以降の図解は略。

 

コンピュータが出力した手順をいくつか示しておく。が、基本のやり方を理解すれば具体手順列に意味はない。

 

H3 = u3 d2^ u2^ d3 u2 d2

H4 = u4 d2^ u2^ d3^ u2 d2 u3^ d4 u3 d2^ u2^ d3 u2 d2

H5 = u5  d2^ u2^ d3^ u2 d2 u3^ d4^ u3 d2^ u2^ d3 u2 d2 u4^  

d5  u4 d2^ u2^ d3^ u2 d2 u3^ d4 u3 d2^ u2^ d3 u2 d2

H3^ = d2^ u2^ d3^ u2 d2 u3^

H4^ = d2^ u2^ d3^ u2 d2 u3^ d4^ u3 d2^ u2^ d3 u2 d2 u4^

H5^ =  d2^ u2^ d3^ u2 d2 u3^ d4^ u3 d2^ u2^ d3 u2 d2 u4^  d5^

u4 d2^ u2^ d3^ u2 d2 u3^ d4 u3 d2^ u2^ d3 u2 d2   u5^

 

なお、Cコードは以下。

 

h(int n)

{

              if(n==2){ printf("u2 d2 "); return; }

              printf("u%d ",n); hr(n-1);

              printf("d%d ",n); h(n-1);

}

hr(int n)

{

              if(n==2){ printf("d2^ u2^ "); return; }

              hr(n-1); printf("d%d^ ",n);

              h(n-1);  printf("u%d^ ",n);

}

main()

{

              printf("H3 = ");  h(3);  printf("\n");

              printf("H4 = ");  h(4);  printf("\n");

              printf("H5 = ");  h(5);  printf("\n");

              printf("H3^ = "); hr(3); printf("\n");

              printf("H4^ = "); hr(4); printf("\n");

              printf("H5^ = "); hr(5); printf("\n");

}

 

 

トップページへ

 

Ads by TOK2