proof 发表于 2022-9-16 15:40:49

汉诺塔问题 求助

盲盒,非粘贴。

请分析一下我这个思路,做出更正。

// 汉诺塔
#include <iostream>
#include <cstring>
using namespace std;

void move(int s , char a , char b , char c){
    if (s==1) return;
    cout<<a<<"--"<<b<<endl;
    move(s-1,a,c,b);
    cout<<a<<"--"<<c<<endl;
          
}

int main(){
    int n=4;

        move(n,'a','b','c');// 4层盘,从a杆开始,以b杆为中介,移动到c杆
       
    return 0;
}

cnkizy 发表于 2022-9-16 15:58:56

// 汉诺塔
#include <iostream>
#include <cstring>
using namespace std;

void move(int s, char a, char b, char c) {
    if (s == 1) { cout << a << "--" << c << endl; return; }
    move(s - 1, a, c, b); // 把n-1的圆环从a移动到b,递归调用下一层就是把a移动到c
    cout << a << "--" << c << endl;
    move(s - 1, b, a, c); //把n-1的圆环从b移动到c
}

int main() {
    int n = 4;

    move(n, 'a', 'b', 'c');// 4层盘,从a杆开始,以b杆为中介,移动到c杆

    return 0;
}

proof 发表于 2022-9-16 16:06:23

正纠结:是用两个打印输出,还是用两个调用?

proof 发表于 2022-9-16 16:25:50

cnkizy 发表于 2022-9-16 15:58


感谢。
仔细阅读。

howzyao 发表于 2022-9-16 23:47:37

想问一下,这个s在递归里,默认是传址操作,还是传值操作?
0次进去,碰到自己,翻倍 2次掉用;没有出来,还碰到自己:
0 1进去 的 成了 4次
0+ 1 =2把2次翻倍了8次 再进 16 再进 32 此时,开始打印+return
眼看的,没有敲,话说这,真烧脑.
你搞个结果看看.

两手空空儿 发表于 2022-9-17 17:16:47

你的思路是不清晰的
我的对汉诺塔的理解是建立两种模型
第一种,只有一个盘,解题步骤就是从a-->c
第二种:只有两个盘,把从1-(n-1)个盘看成一个整体,记为盘1,第n个盘记为盘2
解题步骤就是
1、把盘1从a-->b
2、盘2从a-->c
3、盘1从b-->c
完成
希望对你有所帮助

proof 发表于 2022-9-19 10:48:36

感谢。理解了一些。
页: [1]
查看完整版本: 汉诺塔问题 求助