Tower of Hanoi 3D Interactive Demo
2020-12-16 15:51
This GeoGebra applet presents an interactive 3D model of the classic Tower of Hanoi puzzle. Users can move discs between three rods following the rules: moving only one disc at a time and never placing a larger disc on a smaller one. Utilizing Polygon and Sequence commands, the model creates a 3D visual effect while tracking the number of moves and discs in real-time. This demonstration visually i
In collections
Math Games with GeoGebra
<?xml version="1.0" encoding="utf-8"?>
<geogebra format="5.0" version="5.0.620.0" app="classic" platform="w" id="d0900baa-b39b-40fa-8941-b3541d14bd20" xsi:noNamespaceSchemaLocation="http://www.geogebra.org/apps/xsd/ggb.xsd" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<gui>
<window width="1425" height="627" />
<perspectives>
<perspective id="tmp">
<panes>
<pane location="" divider="0.4014035087719298" orientation="1" />
</panes>
<views>
<view id="4" toolbar="0 || 2020 , 2021 , 2022 , 66 || 2001 , 2003 , 2002 , 2004 , 2005 || 2040 , 2041 , 2042 , 2044 , 2043" visible="false" inframe="false" stylebar="true" location="1,1" size="300" window="100,100,600,400" />
<view id="2" visible="false" inframe="false" stylebar="true" location="3,3" size="275" tab="ALGEBRA" window="717,107,485,866" />
<view id="8" toolbar="1001 | 1002 | 1003 || 1005 | 1004 || 1006 | 1007 | 1010 || 1008 1009 || 66 68 || 6" visible="false" inframe="false" stylebar="false" location="1,3" size="300" window="100,100,600,400" />
<view id="4097" visible="false" inframe="false" stylebar="true" location="1,1" size="395" window="60,168,1784,810" />
<view id="1" visible="true" inframe="false" stylebar="false" location="3" size="572" window="100,100,600,400" />
<view id="16" visible="false" inframe="false" stylebar="false" location="1" size="150" window="50,50,500,500" />
<view id="32" visible="false" inframe="false" stylebar="true" location="1" size="150" window="50,50,500,500" />
<view id="64" toolbar="0" visible="false" inframe="false" stylebar="false" location="1" size="150" window="50,50,500,500" />
<view id="128" visible="false" inframe="false" stylebar="false" location="1" size="480" window="50,50,500,500" />
<view id="70" toolbar="0 || 2020 || 2021 || 2022" visible="false" inframe="false" stylebar="true" location="1" size="150" window="50,50,500,500" />
<view id="512" toolbar="0 | 1 501 5 19 , 67 | 2 15 45 18 , 7 37 | 514 3 9 , 13 44 , 47 | 16 | 551 550 11 , 20 22 21 23 , 55 56 57 , 12 | 69 | 510 511 , 512 513 | 533 531 , 534 532 , 522 523 , 537 536 , 535 | 521 520 | 36 , 38 49 560 | 571 30 29 570 31 33 | 17 | 540 40 41 42 , 27 28 35 , 6 , 502" visible="true" inframe="false" stylebar="false" location="1" size="845" window="660,320,600,400" />
</views>
<toolbar show="false" items="0 39 73 62 | 1 501 67 , 5 19 , 72 75 76 | 2 15 45 , 18 65 , 7 37 | 4 3 8 9 , 13 44 , 58 , 47 | 16 51 64 , 70 | 10 34 53 11 , 24 20 22 , 21 23 | 55 56 57 , 12 | 36 46 , 38 49 50 , 71 14 68 | 30 29 54 32 31 33 | 25 17 26 60 52 61 | 40 41 42 , 27 28 35 , 6" position="1" help="false" />
<input show="false" cmd="true" top="algebra" />
<dockBar show="false" east="false" />
</perspective>
</perspectives>
<labelingStyle val="3"/>
<font size="24"/>
</gui>
<euclidianView>
<viewNumber viewNo="1"/>
<size width="572" height="626"/>
<coordSystem xZero="286" yZero="347.5000000000001" scale="62.29307100053271" yscale="62.29307100053257"/>
<evSettings axes="false" grid="false" gridIsBold="false" pointCapturing="1" rightAngleStyle="1" checkboxSize="26" gridType="3"/>
<bgColor r="255" g="250" b="205"/>
<axesColor r="0" g="0" b="0"/>
<gridColor r="192" g="192" b="192"/>
<lineStyle axes="1" grid="0"/>
<axis id="0" show="false" label="" unitLabel="" tickStyle="1" showNumbers="true"/>
<axis id="1" show="false" label="" unitLabel="" tickStyle="1" showNumbers="true"/>
</euclidianView>
<kernel>
<uses3D val="true"/>
<continuous val="false"/>
<usePathAndRegionParameters val="true"/>
<decimals val="2"/>
<angleUnit val="degree"/>
<algebraStyle val="0" spreadsheet="0"/>
<coordStyle val="0"/>
</kernel>
<tableview min="-2" max="2" step="1"/>
<scripting blocked="false" disabled="false"/>
<euclidianView3D>
<coordSystem xZero="0" yZero="0" zZero="-1.5" scale="50" xAngle="31" zAngle="2088.000376692338"/>
<evSettings axes="false" grid="false" gridIsBold="false" pointCapturing="3" rightAngleStyle="1" gridType="3"/>
<axis id="0" show="false" label="" unitLabel="" tickStyle="1" showNumbers="true"/>
<axis id="1" show="false" label="" unitLabel="" tickStyle="1" showNumbers="true"/>
<axis id="2" show="false" label="" unitLabel="" tickStyle="1" showNumbers="true"/>
<plate show="false"/>
<bgColor r="255" g="239" b="213"/>
<clipping use="false" show="false" size="2"/>
<projection type="1"/>
</euclidianView3D>
<construction title="" author="" date="">
<expression label="seqA" exp="{1, 2, 3, 4, 5}"/>
<element type="list" label="seqA">
<objColor r="0" g="100" b="0" alpha="0.10000000149011612"/>
<animation step="1" speed="1" type="0" playing="false"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<expression label="seqB" exp="{}"/>
<element type="list" label="seqB">
<show object="false" label="false" ev="4"/>
<objColor r="0" g="100" b="0" alpha="0.10000000149011612"/>
<layer val="0"/>
<labelMode val="0"/>
<animation step="1" speed="1" type="0" playing="false"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<listType val="numeric"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<expression label="seqC" exp="{}"/>
<element type="list" label="seqC">
<show object="false" label="false" ev="4"/>
<objColor r="0" g="100" b="0" alpha="0.10000000149011612"/>
<layer val="0"/>
<labelMode val="0"/>
<animation step="1" speed="1" type="0" playing="false"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<listType val="numeric"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<expression label="tmp" exp="{}"/>
<element type="list" label="tmp">
<show object="false" label="false" ev="4"/>
<objColor r="0" g="100" b="0" alpha="0.10000000149011612"/>
<layer val="0"/>
<labelMode val="0"/>
<animation step="1" speed="1" type="0" playing="false"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<listType val="numeric"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<element type="button" label="buttonReset">
<show object="true" label="true"/>
<objColor r="0" g="0" b="0" alpha="0"/>
<bgColor r="191" g="255" b="0" alpha="255"/>
<layer val="9"/>
<labelOffset x="348" y="98"/>
<labelMode val="3"/>
<tooltipMode val="2"/>
<fixed val="true"/>
<auxiliary val="true"/>
<ggbscript val="seqA=CopyFreeObject(Sequence(n))
seqB={}
seqC={}
tmp={}
tmpA={}
tmpB={}
tmpC={}
moves=0"/>
<font serif="false" sizeM="2" size="24" style="1"/>
<caption val="重新遊戲 Reset"/>
</element>
<expression label="tmpA" exp="{}"/>
<element type="list" label="tmpA">
<show object="false" label="false" ev="4"/>
<objColor r="0" g="100" b="0" alpha="0.10000000149011612"/>
<layer val="8"/>
<labelMode val="0"/>
<animation step="1" speed="1" type="0" playing="false"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<listType val="numeric"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<expression label="tmpB" exp="{}"/>
<element type="list" label="tmpB">
<show object="false" label="false" ev="4"/>
<objColor r="0" g="100" b="0" alpha="0.10000000149011612"/>
<layer val="8"/>
<labelMode val="0"/>
<animation step="1" speed="1" type="0" playing="false"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<listType val="numeric"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<expression label="tmpC" exp="{}"/>
<element type="list" label="tmpC">
<show object="false" label="false" ev="4"/>
<objColor r="0" g="100" b="0" alpha="0.10000000149011612"/>
<layer val="8"/>
<labelMode val="0"/>
<animation step="1" speed="1" type="0" playing="false"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<listType val="numeric"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<command name="Length">
<input a0="seqA"/>
<output a0="nA"/>
</command>
<element type="numeric" label="nA">
<value val="5"/>
<objColor r="0" g="0" b="0" alpha="0.10000000149011612"/>
</element>
<command name="Length">
<input a0="seqB"/>
<output a0="nB"/>
</command>
<element type="numeric" label="nB">
<value val="0"/>
<objColor r="0" g="0" b="0" alpha="0.10000000149011612"/>
<ggbscript onUpdate="showDone=nB==n||nC==n"/>
</element>
<command name="Length">
<input a0="seqC"/>
<output a0="nC"/>
</command>
<element type="numeric" label="nC">
<value val="0"/>
<objColor r="0" g="0" b="0" alpha="0.10000000149011612"/>
<ggbscript onUpdate="showDone=nB==n||nC==n"/>
</element>
<expression label="nod" exp="{3, 4, 5, 6, 7, 8}"/>
<element type="list" label="nod">
<show object="true" label="false" ev="4"/>
<objColor r="75" g="0" b="130" alpha="0.10000000149011612"/>
<bgColor r="255" g="255" b="0" alpha="255"/>
<layer val="9"/>
<labelOffset x="424" y="38"/>
<labelMode val="0"/>
<fixed val="true"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<selectedIndex val="2"/>
<comboBox val="true"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
<symbolic val="true" />
</element>
<command name="SelectedElement">
<input a0="nod"/>
<output a0="n"/>
</command>
<element type="numeric" label="n">
<value val="5"/>
<objColor r="0" g="0" b="0" alpha="0.10000000149011612"/>
<ggbscript onUpdate="seqA=CopyFreeObject(Sequence(n))
seqB={}
seqC={}
tmp={}
tmpA={}
tmpB={}
tmpC={}
moves=0"/>
</element>
<expression label="textNod" exp=""選擇圓盤數量 Number of Disks""/>
<element type="text" label="textNod">
<show object="true" label="false" ev="40"/>
<objColor r="0" g="0" b="0" alpha="0"/>
<layer val="9"/>
<labelMode val="0"/>
<fixed val="true"/>
<font serif="false" sizeM="1" size="0" style="1"/>
<absoluteScreenLocation x="64" y="64"/>
</element>
<expression label="textRule" exp=""
遊戲目標是將所有金盤全部移動至另一根銀棒,移動過程必須遵守
以下規定:

 1) 一次只能移動一個金盤。
 2) 只能拿取每根銀棒上最上面的金盤,並放到另一銀棒上。
 3) 較大的金盤不能堆疊在小的金盤之上。

遊戲方式:點擊銀棒或台座,可拿起或放置金盤

The objective of the puzzle is to move the entire stack to another rod,
obeying the following simple rules:

 1) Only one disk can be moved at a time.
 2) Each move consists of taking the upper disk from one of the stacks 
 and placing it on top of another stack or on an empty rod.
 3) No larger disk may be placed on top of a smaller disk.

How to play: click or tap the plate/rod to take or place the disk. 
 ""/>
<element type="text" label="textRule">
<show object="true" label="false" ev="40"/>
<condition showObject="showRule"/>
<objColor r="0" g="0" b="0" alpha="0"/>
<layer val="9"/>
<labelMode val="0"/>
<font serif="false" sizeM="0.7" size="-8" style="1"/>
<absoluteScreenLocation x="22" y="188"/>
<ggbscript val="showRule=false"/>
</element>
<expression label="mm" exp="2^(n) - 1" />
<element type="numeric" label="mm">
<value val="31"/>
<objColor r="0" g="0" b="0" alpha="0.10000000149011612"/>
</element>
<expression label="moves" exp="0"/>
<element type="numeric" label="moves">
<value val="0"/>
<show object="false" label="true"/>
<objColor r="0" g="0" b="0" alpha="0.10000000149011612"/>
<layer val="0"/>
<labelMode val="1"/>
<animation speed="1" type="0" playing="false"/>
</element>
<command name="Polygon">
<input a0="{Corner[1], Corner[2], Corner[3], Corner[4]}"/>
<output a0="polyMask"/>
</command>
<element type="polygon" label="polyMask">
<lineStyle thickness="5" type="0" typeHidden="1" opacity="178"/>
<show object="true" label="false" ev="8"/>
<condition showObject="showRule ∨ showDone"/>
<objColor r="255" g="250" b="205" alpha="0.949999988079071"/>
<layer val="7"/>
<labelMode val="0"/>
<ggbscript val="showRule=false
showDone=false
"/>
</element>
<expression label="showDone" exp="nB ≟ n ∨ nC ≟ n" />
<element type="boolean" label="showDone">
<value val="false"/>
<show object="false" label="true"/>
<objColor r="0" g="0" b="0" alpha="0"/>
<layer val="0"/>
<labelMode val="0"/>
<checkbox fixed="true"/>
</element>
<element type="boolean" label="showRule">
<value val="false"/>
<show object="false" label="true"/>
<objColor r="0" g="0" b="0" alpha="0"/>
<layer val="0"/>
<labelMode val="0"/>
<checkbox fixed="true"/>
</element>
<element type="button" label="buttonRule">
<show object="true" label="true"/>
<objColor r="0" g="0" b="0" alpha="0"/>
<bgColor r="191" g="255" b="0" alpha="255"/>
<layer val="8"/>
<labelOffset x="37" y="98"/>
<labelMode val="0"/>
<tooltipMode val="2"/>
<fixed val="true"/>
<auxiliary val="true"/>
<ggbscript val="showRule=!showRule
showDone=false"/>
<font serif="false" sizeM="2" size="24" style="1"/>
<caption val="遊戲規則 Game Rules"/>
</element>
<expression label="textDone" exp=""恭喜!
您完成了 " + n + " 個金盤的河內塔。
您一共移動了 " + moves + " 次金盤。
(完成遊戲至少需要移動 " + mm + " 次)

Congratulations!
You have solved a Tower of Hanoi puzzle
with " + n + " disks.
Your moves is " + moves + ".
(The minimal number of moves required is " + mm + ")"" />
<element type="text" label="textDone">
<show object="true" label="false" ev="8"/>
<condition showObject="showDone"/>
<objColor r="255" g="0" b="0" alpha="0"/>
<layer val="9"/>
<labelMode val="0"/>
<font serif="false" sizeM="1" size="0" style="1"/>
<absoluteScreenLocation x="35" y="239"/>
<ggbscript val="showDone=false
"/>
</element>
<command name="Polygon">
<input a0="{Corner[1] + (3 / 4 * (Corner[4] - Corner[1])), Corner[2] + (3 / 4 * (Corner[3] - Corner[2])), Corner[3], Corner[4]}"/>
<output a0="polyMenu"/>
</command>
<element type="polygon" label="polyMenu">
<lineStyle thickness="5" type="0" typeHidden="1" opacity="178"/>
<show object="true" label="false" ev="8"/>
<objColor r="255" g="127" b="0" alpha="1"/>
<layer val="8"/>
<labelMode val="0"/>
</element>
<expression label="rodA" exp="{Cylinder[(0, 4, -1), (0, 4, 4), 0.3], Prism[(0 + 2.5, 4 + 2.5, -1), (0 - 2.5, 4 + 2.5, -1), (0 - 2.5, 4 - 2.5, -1), (0 + 2.5, 4 - 2.5, -1), (0 + 2.5, 4 + 2.5, -0.5)]}" />
<element type="list" label="rodA">
<show object="true" label="false" ev="4"/>
<objColor r="0" g="0" b="255" alpha="1"/>
<layer val="0"/>
<labelMode val="0"/>
<ggbscript val="If[tmp=={}&&seqA!={},SetValue(tmpA,Insert(tmpA,{Min(seqA)},1))]
If[tmp=={}&&seqA!={},SetValue(seqA,Remove(seqA,{Min(seqA)}))]

If[tmp!={}&&(seqA=={}||Min(seqA)>Min(tmp))&&tmpA=={},SetValue(moves,moves+1)]
If[tmp!={}&&(seqA=={}||Min(seqA)>Min(tmp)),{SetValue(tmpA,{}),SetValue(tmpB,{}),SetValue(tmpC,{})}]
If[tmp!={}&&(seqA=={}||Min(seqA)>Min(tmp)),SetValue(seqA,Insert({Min(tmp)},seqA,1))]

SetValue(tmp,Join(tmpA,tmpB,tmpC))"/>
<lineStyle thickness="1" type="0" typeHidden="1"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<expression label="rodB" exp="{Cylinder[((2 * sqrt(3)), -2, -1), ((2 * sqrt(3)), -2, 4), 0.3], Prism[((2 * sqrt(3)) + 2.5, -2 + 2.5, -1), ((2 * sqrt(3)) - 2.5, -2 + 2.5, -1), ((2 * sqrt(3)) - 2.5, -2 - 2.5, -1), ((2 * sqrt(3)) + 2.5, -2 - 2.5, -1), ((2 * sqrt(3)) + 2.5, -2 + 2.5, -0.5)]}" />
<element type="list" label="rodB">
<show object="true" label="false" ev="4"/>
<objColor r="0" g="100" b="0" alpha="1"/>
<layer val="0"/>
<labelMode val="0"/>
<ggbscript val="If[tmp=={}&&seqB!={},SetValue(tmpB,Insert(tmpB,{Min(seqB)},1))]
If[tmp=={}&&seqB!={},SetValue(seqB,Remove(seqB,{Min(seqB)}))]

If[tmp!={}&&(seqB=={}||Min(seqB)>Min(tmp))&&tmpB=={},SetValue(moves,moves+1)]
If[tmp!={}&&(seqB=={}||Min(seqB)>Min(tmp)),{SetValue(tmpA,{}),SetValue(tmpB,{}),SetValue(tmpC,{})}]
If[tmp!={}&&(seqB=={}||Min(seqB)>Min(tmp)),SetValue(seqB,Insert({Min(tmp)},seqB,1))]

SetValue(tmp,Join(tmpA,tmpB,tmpC))"/>
<lineStyle thickness="1" type="0" typeHidden="1"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<expression label="rodC" exp="{Cylinder[((-2 * sqrt(3)), -2, -1), ((-2 * sqrt(3)), -2, 4), 0.3], Prism[((-2 * sqrt(3)) + 2.5, -2 + 2.5, -1), ((-2 * sqrt(3)) - 2.5, -2 + 2.5, -1), ((-2 * sqrt(3)) - 2.5, -2 - 2.5, -1), ((-2 * sqrt(3)) + 2.5, -2 - 2.5, -1), ((-2 * sqrt(3)) + 2.5, -2 + 2.5, -0.5)]}" />
<element type="list" label="rodC">
<show object="true" label="false" ev="4"/>
<objColor r="220" g="20" b="60" alpha="1"/>
<layer val="0"/>
<labelMode val="0"/>
<ggbscript val="If[tmp=={}&&seqC!={},SetValue(tmpC,Insert(tmpC,{Min(seqC)},1))]
If[tmp=={}&&seqC!={},SetValue(seqC,Remove(seqC,{Min(seqC)}))]

If[tmp!={}&&(seqC=={}||Min(seqC)>Min(tmp))&&tmpC=={},SetValue(moves,moves+1)]
If[tmp!={}&&(seqC=={}||Min(seqC)>Min(tmp)),{SetValue(tmpA,{}),SetValue(tmpB,{}),SetValue(tmpC,{})}]
If[tmp!={}&&(seqC=={}||Min(seqC)>Min(tmp)),SetValue(seqC,Insert({Min(tmp)},seqC,1))]

SetValue(tmp,Join(tmpA,tmpB,tmpC))"/>
<lineStyle thickness="1" type="0" typeHidden="1"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<command name="Sequence">
<input a0="Cylinder[(0, 4, (nA - k - 1) / 2), (0, 4, (nA - k) / 2), (seqA(k) + 1) / 3]" a1="k" a2="nA" a3="1" a4="-1"/>
<output a0="stackA"/>
</command>
<element type="list" label="stackA">
<show object="true" label="false" ev="4"/>
<objColor r="255" g="255" b="0" alpha="1"/>
<layer val="0"/>
<labelOffset x="5" y="55"/>
<labelMode val="0"/>
<selectionAllowed val="false"/>
<ggbscript val="If[tmp=={}&&seqA!={},SetValue(tmpA,Insert(tmpA,{Min(seqA)},1))]
If[tmp=={}&&seqA!={},SetValue(seqA,Remove(seqA,{Min(seqA)}))]

If[tmp!={}&&(seqA=={}||Min(seqA)>Min(tmp)),{SetValue(tmpA,{}),SetValue(tmpB,{}),SetValue(tmpC,{})}]
If[tmp!={}&&(seqA=={}||Min(seqA)>Min(tmp)),SetValue(seqA,Insert({Min(tmp)},seqA,1))]

SetValue(tmp,Join(tmpA,tmpB,tmpC))"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<command name="Sequence">
<input a0="Cylinder[((2 * sqrt(3)), -2, (nB - k - 1) / 2), ((2 * sqrt(3)), -2, (nB - k) / 2), (seqB(k) + 1) / 3]" a1="k" a2="nB" a3="1" a4="-1"/>
<output a0="stackB"/>
</command>
<element type="list" label="stackB">
<show object="true" label="false" ev="4"/>
<objColor r="255" g="255" b="0" alpha="1"/>
<layer val="0"/>
<labelMode val="0"/>
<selectionAllowed val="false"/>
<ggbscript val="If[tmp=={}&&seqB!={},SetValue(tmpB,Insert(tmpB,{Min(seqB)},1))]
If[tmp=={}&&seqB!={},SetValue(seqB,Remove(seqB,{Min(seqB)}))]

If[tmp!={}&&(seqB=={}||Min(seqB)>Min(tmp)),{SetValue(tmpA,{}),SetValue(tmpB,{}),SetValue(tmpC,{})}]
If[tmp!={}&&(seqB=={}||Min(seqB)>Min(tmp)),SetValue(seqB,Insert({Min(tmp)},seqB,1))]

SetValue(tmp,Join(tmpA,tmpB,tmpC))"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<listType val="quadriclimited"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<command name="Sequence">
<input a0="Cylinder[((-2 * sqrt(3)), -2, (nC - k - 1) / 2), ((-2 * sqrt(3)), -2, (nC - k) / 2), (seqC(k) + 1) / 3]" a1="k" a2="nC" a3="1" a4="-1"/>
<output a0="stackC"/>
</command>
<element type="list" label="stackC">
<show object="true" label="false" ev="4"/>
<objColor r="255" g="255" b="0" alpha="1"/>
<layer val="0"/>
<labelMode val="0"/>
<selectionAllowed val="false"/>
<ggbscript val="If[tmp=={}&&seqC!={},SetValue(tmpC,Insert(tmpC,{Min(seqC)},1))]
If[tmp=={}&&seqC!={},SetValue(seqC,Remove(seqC,{Min(seqC)}))]

If[tmp!={}&&(seqC=={}||Min(seqC)>Min(tmp)),{SetValue(tmpA,{}),SetValue(tmpB,{}),SetValue(tmpC,{})}]
If[tmp!={}&&(seqC=={}||Min(seqC)>Min(tmp)),SetValue(seqC,Insert({Min(tmp)},seqC,1))]

SetValue(tmp,Join(tmpA,tmpB,tmpC))"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<listType val="quadriclimited"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<expression label="discA" exp="{Cylinder[(0, 4, 5), (0, 4, 5.5), (tmpA(1) + 1) / 3]}" />
<element type="list" label="discA">
<show object="true" label="false" ev="4"/>
<objColor r="255" g="255" b="0" alpha="1"/>
<layer val="0"/>
<labelMode val="0"/>
<tooltipMode val="2"/>
<selectionAllowed val="false"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<expression label="discB" exp="{Cylinder[((2 * sqrt(3)), -2, 5), ((2 * sqrt(3)), -2, 5.5), (tmpB(1) + 1) / 3]}" />
<element type="list" label="discB">
<show object="true" label="false" ev="4"/>
<objColor r="255" g="255" b="0" alpha="1"/>
<layer val="0"/>
<labelMode val="0"/>
<tooltipMode val="2"/>
<selectionAllowed val="false"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<expression label="discC" exp="{Cylinder[((-2 * sqrt(3)), -2, 5), ((-2 * sqrt(3)), -2, 5.5), (tmpC(1) + 1) / 3]}" />
<element type="list" label="discC">
<show object="true" label="false" ev="4"/>
<objColor r="255" g="255" b="0" alpha="1"/>
<layer val="0"/>
<labelMode val="0"/>
<tooltipMode val="2"/>
<selectionAllowed val="false"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<expression label="textMoves" exp=""完成 " + n + " 個金盤的河內塔,最少需移動 " + mm + " 次。
The minimal number of moves required to
solve a Tower of Hanoi puzzle with " + n + " disks
is " + mm + " times.

目前,您已經移動了 " + moves + " 次。
Now, You have moved " + moves + " times.

電腦:用滑鼠右鍵拖曳視角
觸控裝置:用兩指拖曳視角
PC: Drag with right-mouse-button to spin
Touch Device: Drag with two-finger to spin"" />
<element type="text" label="textMoves">
<show object="true" label="false" ev="8"/>
<objColor r="0" g="0" b="0" alpha="0"/>
<layer val="6"/>
<labelMode val="0"/>
<fixed val="true"/>
<selectionAllowed val="false"/>
<font serif="false" sizeM="1" size="0" style="1"/>
<absoluteScreenLocation x="38" y="196"/>
</element>
</construction>
</geogebra>