玩了个汉诺塔的flash游戏,总结下算法
以三层为例,八张图,七步,步骤如下:
游戏过程归纳成算法:步骤拆解,注意我说的第N-几个盘子是从上边数的,和此游戏标的数字相反
注意:每一个中转柱到下一层递归就成为了目的柱,就是传形参嘛,每堆从上边数的(n-i)个盘子都有不同的目的,为了方便,把字母A源、B中转、C目的还是代入了
单层结构示意
hanoi(N,A,B,C){
hanoi(上边N-1盘子个从源A到中转B);
第N个盘子直接源A到目的C;
hanoi(上边N-1个盘子从中转B到目的C);
}
伪代码函数原型(文字叙述的N个盘子从A到C即为hanoi(N,A,B,C))
hanoi(N,A,B,C){
hanoi(N-1,A,C,B);
第N个盘子直接源A到目的C;
hanoi(N-1,B,A,C);
}
为了描述清晰,还是用文字展开过程吧
首次调用——参数N——hanoi(N,A,B,C);
hanoi(上边N-1盘子个从源A到中转B);
第N个盘子直接源A到目的C;
hanoi(上边N-1个盘子从中转B到目的C);
全层次完全展开:
hanoi(上边N-1盘子个从源A到中转B);
第N个盘子直接源A到目的C;
hanoi(上边N-1个盘子从中转B到目的C);
参数N-1——hanoi(N-1,A,B,C);
hanoi(上边N-2盘子个从源A到中转B);
第N-1个盘子直接源A到目的C;
hanoi(上边N-2个盘子从中转B到目的C);
全层次完全展开(新的一层,形参,中转B已变成目的B)
hanoi(上边N-2盘子个从源A到中转C),第N-1个盘子直接源A到目的B,hanoi(上边N-2个盘子从中转C到目的B));
第N个盘子直接源A到目的C;
(hanoi上边N-2个盘子从源B到中转A),第N-1个盘子直接从源B到目的C,hanoi(上边N-2个盘子从中转A到目的C));
(左边一个递归展开,中间一个操作,右边一个递归展开,两边展开中间不动,挺像二叉树的操作)
.....
......
以此类推,参数为2,
hanoi(上边1盘子个从源A到中转B);
第2个盘子直接源A到目的C;
hanoi(上边1个盘子从中转B到目的C);
完全展开,已经展不开了,太大了
直到参数为1——hanoi(1,A,B,C);
这时候该结束了,if(N==1),直接A到C(想想一层汉诺塔),其他的都不管了
所以hanoi函数为
void move(char getone,char putone)
{ cout<< getone <<"-->"<<putone<<endl; }
void hanoi(int n,char one,char two,char three)
{ void move(char getone,char putone);
if (n==1) move (one,three);
else
{ hanoi (n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
程序运行结果:匹配,三层七步,四层十五步