汉诺塔详解 -(递归练习)

首先、三个
    小、中、大
小到A上、中到B、小到中上、大到C上、小到A上、中到大上、小到中上。
也就是小到目标上、中到缓冲上、小到中上、大到目标上、小到初始位置、中到大上、小到中上。
这样。

如果三个都想不出来的话...

那两个总不可能不会了吧???
小挪到缓冲上、大挪到目标上、小挪到大上,

三个就假设是两个的进阶版、先把中间当目标位置,都挪到中间、再把大的挪到右面,然后(现在中间是起始位置)目标换回右面、把中间的挪到右面

四个和两个变三个的做法一样、 都挪到中间、大的挪右边、再以左边的为缓冲从中间往右挪实现方法:
    

#include <bits/stdc++.h> 
using namespace std;

void hannoi (int n, char A, char B, char C)   // 起始盘、缓冲盘、目标盘 
{
    if (n == 1){
        cout << "移动圆盘" << n << "从" << A << "到" << C << endl;   //把最后一个圆环从起始盘移动到目标盘。
    }
    else{
        hannoi (n-1, A, C, B);     // 把N-1个圆环从起点盘移动到(当前)没有任何圆环的过度盘;通过B、C盘在此函数调用中调用位置的互换,来实现把N-1个圆环从A盘到B盘的转移【A--B】。
        cout << "移动圆盘" << n << "从" << A << "到" << C << endl;
     //   hannoi (1, A, B, C);
        hannoi (n-1, B, A, C);    //通过A、B盘在此函数调用中位置的互换,来实现N-1个圆环从B盘到C盘的转移【B--C】。
    }
}
 
int main()
{
    int n;
    cin >> n;

    hannoi (n, 'a', 'b', 'c');

    return 0;
}

python实现:

def move(n,a,b,c):

	if n==1: 
		print(a,'->',c) 
	else: 
		move(n-1,a,c,b) 
		move(1,a,b,c) 
		move(n-1,b,a,c)

猜你喜欢

转载自blog.csdn.net/weixin_41298915/article/details/89318084