ゴージアンノットの攻略法

キューブ王 海永

ゴージアンノットは、以下のようなパズル。

 

 

 左は鳥瞰図。右は側面図。2つの輪は、1点が棒に引っ付いている。輪は側面から見ると、歪曲している。真ん中に輪になった紐が通っている。この紐を外すのがパズルの課題。

“Gordian knot”は英和辞書に載っている。以下の成句で使用。”cut the Gordian knot”。「難題を一刀両断に解決する」。Gordiusが作った結び目を解くものはアジアを支配する、という神託を聞いたアレキサンダー大王がこれを剣で切断して解決した故事(うそでしょう)にちなむという。我々のパズルでは剣はなしです。

英辞郎での、和英の検索結果も載せておく。Theaの違いは当方には分からない。

快刀乱麻: 快刀乱麻を断つ     cut the Gordian knot

一刀両断: 難題を一刀両断に解く cut a Gordian knot

 

[攻略法]

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

紐の先端を持つ。これを下に移動(s)。次に輪の1の部分を通過させる(1j)。次に上に移動(u)。それから1の部分を通過させる(1r)。最後に、紐の先端を下に移動(s)

以上で外れている。1という部分2つあるが、操作系列ではs1j,uirなどと上下関係が明確であるので問題ない。以上の操作を A=s1j*uir*s と書く。

最後に紐が外れてしまうが、外れないように、右図のように止めておいてもいい。

 

[3重のゴジアンノット(抽象論)]

 

今示した攻略法は、子供向けのゴージアンノットにたいするもの。

大人向けのパズルは、例えば3重の入れ子構造になっている。入れ子に対応するのは、実は簡単で、再帰的に解法を示せばいい。ただし抽象論で、具体的な操作系列を提示するものではない。具体論は後述。

 

A=s1j*u1r*sが外す解。入れる(A^)には、矢印を逆にたどって、A^=u1j*s1r*u

 

2重になると、sの代わりにAuの代わりにA^を使用すればいい。勿論、1r2rに、1j2jにしなければならない。

 

3重になると、Aの代わりにBA^の代わりにB^を使用すればいい。勿論、2r3rに、2j3jにしなければならない。

 

[具体的な攻略法]

具体的な操作系列は以下。

 

A = s1j*u1r*s

B = s1j*u1r*s2j*u1j*s1r*u2r*s1j*u1r*s

C = s1j*u1r*s2j*u1j*s1r*u2r*s1j*u1r *s3j*

u1j*s1r*u2j*s1j*u1r*s2r*u1j*s1r *u3r*

s1j*u1r*s2j*u1j*s1r*u2r*s1j*u1r *s

A^= u1j*s1r*u

B^= u1j*s1r*u2j*s1j*u1r*s2r*u1j*s1r*u

C^= u1j*s1r*u2j*s1j*u1r*s2r*u1j*s1r  *u3j*

s1j*u1r*s2j*u1j*s1r*u2r*s1j*u1r  *s3r*

u1j*s1r*u2j*s1j*u1r*s2r*u1j*s1r  *u

 

この系列を吐き出すCコードは以下。

 

gor(int n)

{             if(n==1){ printf("s1j*u1r*s"); return; }

              gor(n-1); printf("%dj*",n);

              rog(n-1); printf("%dr*",n);

              gor(n-1);

}

rog(int n)

{             if(n==1){ printf("u1j*s1r*u"); return; }

              rog(n-1); printf("%dj*",n);

              gor(n-1); printf("%dr*",n);

              rog(n-1);

}

main()

{

              printf("A = "); gor(1); printf("\n");

              printf("B = "); gor(2); printf("\n");

              printf("C = "); gor(3); printf("\n");

              printf("A^= "); rog(1); printf("\n");

              printf("B^= "); rog(2); printf("\n");

              printf("C^= "); rog(3); printf("\n");

}

戻る

 

Ads by TOK2