|
发表于 2020-2-23 11:52:28
|
显示全部楼层
楼主是对这个版本的汉诺塔不熟悉,还是对整个汉诺塔不熟悉?
如果单独对整个汉诺塔不熟习,你先把注释写详细一些
给出了One Possible Version
- #include<stdio.h>
- void f(char a,char b)
- {
- printf("从%c柱上往%c柱上挪动一个圆盘\n",a,b);
- }
- void g(int i,char a,char b,char c) /* i 是要移动的片片个数,a为起始柱,b是中介柱,c是目标柱*/
- if(i==2)//单独处理两个片
- {
- f(a,b);
- f(a,c);
- f(b,c);
- }
- else if(i>2)//不是两个片时,以下为具体操作步骤
- {
- g(i-1,a,c,b); /*调用g函数,以起始柱为起始,目标柱为中介,中介柱为目标移动起始(起始柱)上的i -1个片片*/
- f(a,c);/*单独处理最下面的片片,从起始直接移动到目标*/
- g(i-1,b,a,c);/*处理剩下的片片,以中介柱为起始,以起始柱为中介,以目标柱为目标,移动起始(中介柱)上的i-1个片片*/
- }
- }
- int main(void)
- {
- g(4,'A','B','C');
- return 0;
- }
复制代码
把形参的知识弄明白。定义或者声明函数时,形参所在的位置代表的意义,在设计者的心理已经定型,不会改变。所以具体操作步骤里面的内容,那几个形参的顺序调动,是形参的意义改变,而第2个位置永远都代表起始,第3个位置永远代表中介,第4个位置永远代表目标
具体步骤,就像俄罗斯套娃倒过来想,分治的思想
以5个娃为例说明不是两个片时的具体操作步骤1>2>3>4>5(1>2:1号娃个头大于2号娃,以此类推)
1.把1号娃的盖子打开g(i-1,a,c,b)
2.把装有3号娃的2号娃放进1号娃里面。f(a,c)
3.把1号娃的盖子盖上g(i-1,b,a,c)
我说明白了么? |
|