|
Autor |
Nachricht |
Puge Henis
|
Titel: Türme von Hanoi
Verfasst am: So, 23 Sep 2007, 07:59 |
|
|
Türme von Hanoi
Das Spiel besteht aus drei Stäben A, B und C, auf die mehrere gelochte Scheiben gelegt werden, alle verschieden groß. Zu Beginn liegen alle Scheiben auf Stab A, der Größe nach geordnet, mit der größten Scheibe unten und der kleinsten oben. Ziel des Spiels ist es, den kompletten Scheiben-Stapel von A nach C zu versetzen.
Bei jedem Zug darf die oberste Scheibe eines beliebigen Stabes auf einen der beiden anderen Stäbe gelegt werden, vorausgesetzt, dort liegt nicht schon eine kleinere Scheibe. Folglich sind zu jedem Zeitpunkt des Spieles die Scheiben auf jedem Feld der Größe nach geordnet.
http://www.mathematik.ch/spiele/hanoi_mit_grafik/
|
|
Nach oben |
|
boris
Beiträge: 11154
|
Titel: (Kein Titel)
Verfasst am: Di, 25 Sep 2007, 19:41 |
|
|
Eigentlich nicht schwer, wenn man das Prinzip einmal raushat ... dann aber noch die minimal möglichen Züge raus finden ? Och nöööö, laß mal ...
____________ beehave - home of humbug ... [we can't afford to be neutral]
|
|
Nach oben |
|
bumpi
Beiträge: 499
|
Titel: (Kein Titel)
Verfasst am: Di, 25 Sep 2007, 20:10 |
|
|
boris @ Di, 25 Sep 2007, 20:41 gab folgendes von sich: |
Eigentlich nicht schwer, wenn man das Prinzip einmal raushat ... dann aber noch die minimal möglichen Züge raus finden ? Och nöööö, laß mal ... |
(2^n)-1
Aber nicht mehr so ganz neu, Programmieraufgabe Oberstufe, oder spätestens 1. Semester. Trotzdem immer wieder schön.
|
|
Nach oben |
|
boris
Beiträge: 11154
|
Titel: (Kein Titel)
Verfasst am: Di, 25 Sep 2007, 20:28 |
|
|
bumpi @ Di, 25 Sep 2007, 21:10 gab folgendes von sich: |
(2^n)-1 |
Äh ... ja ...
Ich meinte nicht die Anzahl der Züge sondern die Züge selbst !
Die Anzahl wird auf der Seite ja jeweils auch schon angezeigt, ich wollte halt nur nicht so lange rumprobieren, bis ich die Nummer in der minimal möglichen Anzahl schaffe ...
____________ beehave - home of humbug ... [we can't afford to be neutral]
|
|
Nach oben |
|
bumpi
Beiträge: 499
|
Titel: (Kein Titel)
Verfasst am: Di, 25 Sep 2007, 21:52 |
|
|
boris gab folgendes von sich: |
Äh ... ja ...
Ich meinte nicht die Anzahl der Züge sondern die Züge selbst !
|
Bei ungeradem n: Erste Scheibe auf das Ziel
Bei geradem n: Erste Scheibe auf die Mitte
So?
|
|
Nach oben |
|
boris
Beiträge: 11154
|
Titel: (Kein Titel)
Verfasst am: Mi, 26 Sep 2007, 11:32 |
|
|
Den kannte ich noch nicht ...
____________ beehave - home of humbug ... [we can't afford to be neutral]
|
|
Nach oben |
|
bios
|
Titel: (Kein Titel)
Verfasst am: Fr, 19 Okt 2007, 08:58 |
|
|
hey, nicht nur Programmieraufgabe Oberstufe, oder spätestens 1. Semester ..
auch Teil von Psychotests - Problemlösung und Denken -
kann man auch feststellen, ob der PFC noch richtig arbeitet.
... und, schon gecheckt ob der Tip von bumpi (Bei ungeradem n: Erste Scheibe auf das Ziel
Bei geradem n: Erste Scheibe auf die Mitte ) funzt?
|
|
Nach oben |
|
Eckat
|
Titel: (Kein Titel)
Verfasst am: Fr, 19 Okt 2007, 11:33 |
|
|
Moin
Jo,die Sache mit gerade/ungerade funzt....
Wird aber auf Dauer langweilig die Sache,
da ja keine neuen Herausforderungen auftauchen.
Versuchs lieber hiermit : Sokoban
.....oder hiermit : Theseus und der Minotauer
Ansonsten sind da noch viele Rätsel auf der Seite.
Gruß Eckat
|
|
Nach oben |
|
boris
Beiträge: 11154
|
Titel: (Kein Titel)
Verfasst am: So, 21 Okt 2007, 08:14 |
|
|
Eckat @ Fr, 19 Okt 2007, 12:33 gab folgendes von sich: |
Theseus und der Minotauer |
Alter Schwede !
Ich bin zugegebenermaßen nicht besonders geduldig bei solchen Dingern und hab mir nach kurzer Zeit schon die Lösung anzeigen lassen - das Teil ist ja der Knüller ...
____________ beehave - home of humbug ... [we can't afford to be neutral]
|
|
Nach oben |
|
Puge Henis
|
Titel: (Kein Titel)
Verfasst am: So, 11 Nov 2007, 01:25 |
|
|
http://www.dynamicdrive.com/dynamicindex12/towerhanoi.htm
komplett in Javascript realisiert:
Code: |
/***********************************************
* Tower of Hanoi- by Glenn G. Vergara (glenngv@REMOVETHISyahoo.com)
* This notice must stay intact for use
* Visit Dynamic Drive (http%u3a//www.dynamicdrive.com/) for full source code
***********************************************/
var delay = 200; //in milliseconds
var drag=false;
var objDisk=null;
var x = 0;
var y = 0;
var disksOnTower1 = new Array(null,null,null,null,null,null,null,null);
var disksOnTower2 = new Array(null,null,null,null,null,null,null,null);
var disksOnTower3 = new Array(null,null,null,null,null,null,null,null);
var disksOnTowers = new Array(disksOnTower1,disksOnTower2,disksOnTower3);
var offsetleft = 30;
var offsettop = 30;
var offsettower = 20;
var offsethoriz = 30;
var basetop = 0;
var diskheight = 0;
var midhoriztower = 0;
var indexTo=1;
var indexFr=1;
var movectr=0;
var gameOver=false;
var prevIndex=0;
var zindex = 0;
var currTower=1;
var prevTower=1;
var demo=false;
var arrFr = new Array(255);
var arrTo = new Array(255);
var idx = 0;
var pos = 0;
var t=null;
var stop=false;
function init(){
if (document.getElementById){
var diskno = document.hanoi.diskno;
diskno.options.selectedIndex = 0;
drawTowers();
drawDisks(parseInt(diskno.options[diskno.options.selectedIndex].text));
}
}
function initVars(){
for (var i=0;i<disksOnTower1.length;i++){
disksOnTower1[i]=null;
disksOnTower2[i]=null;
disksOnTower3[i]=null;
}
drag = false;
indexTo = 1;
indexFr = 1;
movectr = 0;
zindex = 0;
idx = 0;
pos = 0;
t = null;
gameOver=false;
stop=false;
demo=false;
document.hanoi.btnUndo.disabled=true;
}
function drawTowers(){
var title=document.getElementById("title");
var tower1=document.getElementById("tower1");
var tower2=document.getElementById("tower2");
var tower3=document.getElementById("tower3");
var settings=document.getElementById("settings");
var titlewidth = parseInt(title.style.width);
var titleheight = parseInt(title.style.height);
var towerwidth = parseInt(tower1.style.width);
var towerheight = parseInt(tower1.style.height);
var settingswidth = parseInt(settings.style.width);
midhoriztower = parseInt(document.getElementById("horiztower1").style.width)/2;
diskheight = parseInt(document.getElementById("disk1").style.height);
title.style.left=offsetleft+(1.5*towerwidth)+offsettower-(titlewidth/2)+"p x";
title.style.top=offsettop+"px";
tower1.style.left=offsetleft+"px";
tower1.style.top=offsettop+titleheight+offsethoriz+"px";
tower2.style.left=offsetleft+towerwidth+offsettower+"px";
tower2.style.top=offsettop+titleheight+offsethoriz+"px";
tower3.style.left=offsetleft+(towerwidth+offsettower)*2+"px";
tower3.style.top=offsettop+titleheight+offsethoriz+"px";
settings.style.left=offsetleft+(1.5*towerwidth)+offsettower-(settingswidth/ 2)+"px";
settings.style.top=parseInt(tower1.style.top)+towerheight+offsethoriz+"px ";
}
function drawDisks(disknum){
var tower1=document.getElementById("tower1");
var disktop = parseInt(tower1.style.top)+parseInt(document.getElementById("horiztower1" ).style.top);
var lefttower1 = parseInt(tower1.style.left);
var disk;
var f=document.hanoi;
basetop = disktop;
for (var i=disksOnTower1.length;i>=1;i--){
disk = document.getElementById("disk"+i);
disk.style.zIndex=++zindex;
if (i<=disknum){
disk.style.left=lefttower1+midhoriztower-parseInt(disk.style.width)/2+"px ";
disk.style.top=disktop-diskheight-1+"px";
disktop = parseInt(disk.style.top);
disksOnTowers[0][i-1]=disk;
}
else {
disk.style.left="-250px";
disk.style.top="-250px";
disksOnTowers[0][i-1]=null;
}
}
f.minmove.value=f.diskno.options[f.diskno.options.selectedIndex].value;
f.yourmove.value=0;
}
function newGame(obj){
if (movectr>0 && !gameOver && !stop){
if (confirm("Current game will be aborted, would you like to continue?")){
initVars();
drawDisks(parseInt(obj.options[obj.options.selectedIndex].text));
}
else document.hanoi.diskno.options.selectedIndex=prevIndex;
}
else {
initVars();
drawDisks(parseInt(obj.options[obj.options.selectedIndex].text));
}
}
function initializeDrag(disk,e){
if (!e) e=event;
if (stop){
alert("You cannot continue solving the puzzle after clicking the 'Stop' button.\nClick 'Restart' button or select no. of disks to continue playing.");
return;
}
indexFr = indexTo;
if (disk.id!=disksOnTowers[indexFr-1][0].id || gameOver || demo) return;
objDisk=disk;
x=e.clientX;
y=e.clientY;
tempx=parseInt(disk.style.left);
tempy=parseInt(disk.style.top);
document.onmousemove=dragDisk;
}
function dragDisk(e){
if (!e) e=event;
zindex++;
drag=true;
var posX = tempx+e.clientX-x;
var posY = tempy+e.clientY-y;
var objTower1 = document.getElementById("tower1");
var objTower2 = document.getElementById("tower2");
var objTower3 = document.getElementById("tower3");
var tower1Left = parseInt(objTower1.style.left);
var tower2Left = parseInt(objTower2.style.left);
var tower3Left = parseInt(objTower3.style.left);
var tower3Width = parseInt(objTower3.style.width);
objDisk.style.zIndex=zindex;
objDisk.style.left=posX+'px';
objDisk.style.top=posY+'px';
if (e.clientX>=document.body.clientWidth-10 || e.clientY>=document.body.clientHeight-5 || e.clientX==5 || e.clientY==5){ //outside available window
indexTo=indexFr;
dropDisk(objDisk);
}
else if ( //in the vicinity of tower 3
(tower3Left<=posX) &&
(tower3Left+tower3Width>=posX) &&
(parseInt(objTower3.style.top)+parseInt(objTower3.style.height)>posY)
){
indexTo=3;
}
else if ((tower2Left<=posX) && (tower2Left+tower3Width>=posX)){ //in the vicinity of tower 2
indexTo=2;
}
else if ((tower1Left<=posX) && (tower1Left+parseInt(objTower1.style.width)>=posX)){ //in the vicinity of tower 1
indexTo=1;
}
else indexTo = indexFr;
return false;
}
function dropDisk(disk){
var f=document.hanoi;
document.onmousemove=new Function("return false");
if (!drag) return;
var gameStatus=false;
var topDisk = disksOnTowers[indexTo-1][0];
if (indexFr==indexTo){
getNewTop(indexFr,null);
pushDisk(disk,indexFr); //put disk back to original tower
getNewTop(indexFr,disk);
}
else if (topDisk==null) {
pushDisk(disk,indexTo);
getNewTop(indexFr,null);
getNewTop(indexTo,disk);
movectr++;
currTower=indexTo;
prevTower=indexFr;
f.btnUndo.disabled=false;
}
else if (parseInt(disk.style.width)<parseInt(topDisk.style.width)){
pushDisk(disk,indexTo);
getNewTop(indexFr,null);
getNewTop(indexTo,disk);
movectr++;
currTower=indexTo;
prevTower=indexFr;
if (indexTo==3) gameStatus=checkStatus();
f.btnUndo.disabled=false;
}
else {
getNewTop(indexFr,null);
pushDisk(disk,indexFr); //put disk back to original tower
getNewTop(indexFr,disk);
}
drag=false;
f.yourmove.value=movectr;
if (gameStatus) {
f.btnUndo.disabled=true;
minmove = parseInt(f.minmove.value);
if (movectr==minmove) msg="\nCongratulations! You got it in "+minmove+" moves."
else if (movectr>minmove) msg="\nYou can do better than that."
else msg="";
alert("Game Over !!!"+msg);
gameOver=true;
}
return;
}
function checkStatus(){
var gameStat = false;
var disks=0;
for (var i=0;i<disksOnTower3.length;i++){
if (disksOnTowers[2][i]!=null) disks++;
}
if (disks==parseInt(document.hanoi.diskno.options[document.hanoi.diskno.option s.selectedIndex].text)) gameStat=true;
return gameStat;
}
function pushDisk(disk,index){
var diskWidth = parseInt(disk.style.width);
var towerLeft = parseInt(document.getElementById("tower"+index).style.left);
var topDisk = disksOnTowers[index-1][0];
if (topDisk!=null){
topDiskWidth = parseInt(topDisk.style.width);
topDiskTop = parseInt(topDisk.style.top);
disk.style.left=towerLeft+midhoriztower-diskWidth/2+"px";
disk.style.top=topDiskTop-diskheight-1+"px";
}
else {
disk.style.left=towerLeft+midhoriztower-diskWidth/2+"px";
disk.style.top=basetop-diskheight-1+"px";
}
}
function getNewTop(index,disk){
if (disk==null){ //pop
for (var i=0;i<disksOnTower1.length-1;i++){
disksOnTowers[index-1][i]=disksOnTowers[index-1][i+1];
}
disksOnTowers[index-1][disksOnTower1.length-1]=null;
}
else { //push
for (var i=disksOnTower1.length-1;i>=1;i--){
disksOnTowers[index-1][i]=disksOnTowers[index-1][i-1];
}
disksOnTowers[index-1][0]=disk;
}
}
function solve(btn){
if (btn.value=="Solve"){
if (movectr>0 && !gameOver && !stop)
if (!confirm("Current game will be aborted, would you like to continue?")) return;
btn.value="Stop";
initVars();
stop=false;
demo=true;
var f=document.hanoi;
f.btnIns.disabled=true;
f.btnRes.disabled=true;
f.btnUndo.disabled=true;
disknum = parseInt(f.diskno.options[f.diskno.options.selectedIndex].text);
drawDisks(disknum);
getMoves(0, 2, 1, disknum);
t=window.setTimeout("moveDisk()",delay);
}
else {
if (t) {
window.clearTimeout(t);
btn.value="Solve";
frm.btnIns.disabled=false;
frm.btnRes.disabled=false;
t = null;
stop=true;
demo=false;
}
}
}
function moveDisk(){
frm = document.hanoi;
disk=disksOnTowers[arrFr[pos]][0];
pushDisk(disk,arrTo[pos]+1);
getNewTop(arrFr[pos]+1,null);
getNewTop(arrTo[pos]+1,disk);
movectr++;
frm.yourmove.value=movectr;
pos++;
if (movectr<parseInt(frm.minmove.value)) t=window.setTimeout("moveDisk()",delay);
else {
alert("Can you do that in "+movectr+" moves?");
gameOver=true;
stop=false;
frm.btnSolve.value="Solve";
frm.btnIns.disabled=false;
frm.btnRes.disabled=false;
}
}
function getMoves(from,to,empty,numDisk){
if (numDisk > 1) {
getMoves(from, empty, to, numDisk - 1);
arrFr[idx] = from;
arrTo[idx++] = to;
getMoves(empty, to, from, numDisk - 1);
}
else {
arrFr[idx] = from;
arrTo[idx++] = to;
}
}
function unDo(btn){
disk=disksOnTowers[currTower-1][0];
pushDisk(disk,prevTower);
getNewTop(currTower,null);
getNewTop(prevTower,disk);
movectr--;
document.hanoi.yourmove.value=movectr;
btn.disabled=true;
}
function displayIns(){
var msg="Try to move all the disks from TOWER 1 to TOWER 3.\n";
msg+="You may only move one disk at a time.\n";
msg+="You must never allow a bigger disk to go on top of a smaller disk.";
alert(msg);
} |
|
|
Nach oben |
|
|
Schreiben: nein. Antworten: nein. Bearbeiten: nein. Löschen: nein. Umfragen: nein.
|