This is a classic logic problem, fun to program graphically and particularly fun on a real physical set-up. Mine is wooden.
A novice takes time to solve it, given the rules that you can only..
However there is a simple solution a novice can be taught in seconds that makes them able to solve it quickly with next to no thought. For the 8 disks shown below you can do it in 256 moves.
' **** Recursive Hanoi with GUI *****
nomainwin
global N, c
N =8 ' NB stay below 10...
c =1
for i =1 to N ' load peg 1
peg$( 1) =peg$( 1) +str$( i)
if i <>N then peg$( 1) =peg$( 1) +","
next i
peg$( 2) =""
peg$( 3) =""
source$ ="A"
via$ ="B"
target$ ="C"
for i =0 to N
color$( i) =str$( int( 256 *rnd( 1))) +" " +str$( int( 256 *rnd( 1))) +" " +str$( int( 256 *rnd( 1)))
next i
WindowWidth =630
WindowHeight =300
open "Towers of Hanoi- recursively" for graphics_nsb_nf as #w
#w "trapclose quit"
#w "down"
call hanoi N, source$, target$, via$
call display
wait
sub hanoi numDisks, source$, target$, via$
if numDisks =0 then
exit sub
else
call hanoi numDisks -1, source$, via$, target$
print
print " Peg A =# "; peg$( 1); " #"; tab( 20); "Peg B =# "; peg$( 2); " #"; tab( 40); "Peg C =# "; peg$( 3); " #"
print " Move disk "; numDisks; " from peg "; source$; " to peg "; target$
call display
beingMoved$ =""
select case source$
case "A"
beingMoved$ =word$( peg$( 1), 1, ",")
if len( peg$( 1)) <>1 then peg$( 1) =mid$( peg$( 1), instr( peg$( 1), ",") +1) else peg$( 1) ="" ' loses LH term & it is held in beingMoved$
case "B"
beingMoved$ =word$( peg$( 2), 1, ",")
if len( peg$( 2)) <>1 then peg$( 2) =mid$( peg$( 2), instr( peg$( 2), ",") +1) else peg$( 2) =""
case "C"
beingMoved$ =word$( peg$( 3), 1, ",")
if len( peg$( 3)) <>1 then peg$( 3) =mid$( peg$( 3), instr( peg$( 3), ",") +1) else peg$( 3) =""
end select
select case target$
case "A"
if peg$( 1) ="" then peg$( 1) =beingMoved$ else peg$( 1) =beingMoved$ +"," +peg$( 1) ' gains LH term previously held in beingMoved$
case "B"
if peg$( 2) ="" then peg$( 2) =beingMoved$ else peg$( 2) =beingMoved$ +"," +peg$( 2)
case "C"
if peg$( 3) ="" then peg$( 3) =beingMoved$ else peg$( 3) =beingMoved$ +"," +peg$( 3)
end select
call hanoi numDisks -1, via$, target$, source$
end if
end sub
sub display ' display a disk stack described as say "1,2,3" on peg 1
#w "cls"
#w "color 210 50 70"
#w "place 10 255 ; size 6 ; goto 600 255"
#w "place 100 255 ; goto 100 100"
#w "place 300 255 ; goto 300 100"
#w "place 500 255 ; goto 500 100"
#w "color black"
#w "size 2 ; backcolor white"
#w "place 10 50"
#w "\ P1 =<"; peg$( 1); "> P2 =<"; peg$( 2); "> P3 =<"; peg$( 3); ">"
for peg =1 to 3 ' draw the disks specified at the three peg positions
if len( peg$( peg)) <>0 then
numDisksHere =0
for i =1 to len( peg$( peg))
if mid$( peg$( peg), i, 1) ="," then numDisksHere =numDisksHere +1
next i
numDisksHere =numDisksHere +1
#w "backcolor white"
#w "place "; 60 +200 *( peg -1); " 20"
#w "\ "; numDisksHere; " disks here."
for i =0 to numDisksHere -1
w =val( word$( peg$( peg), numDisksHere -i, ","))
#w "backcolor "; color$( w)
#w "place "; peg *200 -w *8 -100; " "; 250 +( 0 -i) *20
#w "boxfilled "; peg *200 +w *8 -100; " "; 250 +( 0 -i) *20 -17
next i
end if
next peg
#w "backcolor white"
'#w "flush"
'#w "getbmp scr 0 0 630 300"
'bmpsave "scr", "hanoi"; c; ".bmp"
'c =c +1
'unloadbmp "scr"
'timer 100, [p]
'wait
'[p]
'timer 0
end sub
sub quit a$
close #a$
end
end sub