汉诺塔

题意:三根柱子,每次移动距离无限制,一次移动一个圆盘,问将所有圆盘从按大小顺序移动到最少需要多少步。

思路:因为这里不需要小圆盘始终在大圆盘上面,所以

设移动个圆盘的方案为,显然先将个圆盘移动到上需要步。

然后最后一个圆盘移动到需要步,然后再将个圆盘移动到需要步。

所以.

汉诺塔1

题意:三根柱子,每次移动距离无限制,一次移动一个圆盘,要求小圆盘始终在大圆盘上面,问将所有圆盘从按大小顺序移动到最少需要多少步。

思路:设移动个圆盘的方案为,显然先将个圆盘移动到上需要 步,然后最后一个圆盘移动到需要步,然后再将个圆盘移动到需要步。所以 。(另外递归或者打表都可以找到规律)

递归代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
#define mst(a) memset(a,0,sizeof a)
int  cnt=0;
void fun(int n,char a,char b,char c){
     if(n==1){
          printf("第%d次移动:将%d号圆盘从 %c 移动到 %c\n",++cnt,1,a,c);
          return;
     } 
     fun(n-1,a,c,b);
    printf("第%d次移动:将%d号圆盘从 %c 移动到 %c\n",++cnt,n,a,c);
     fun(n-1,b,a,c);
}
int main(){
    int n;
    char a='a',b='b',c='c';
    while(~scanf("%d",&n)){
        cnt=0;
        fun(n,a,b,c);
        printf("总共移动次数:%d\n",cnt);
    }
    return 0;
} 

汉诺塔2

题意:三根柱子,每次移动到相邻柱子,一次移动一个圆盘,要求小圆盘始终在大圆盘上面,问将所有圆盘从按大小顺序移动到最少需要多少步。

思路:设移动个圆盘的方案为,先将上面个圆盘移动到上需要 步,然后最后一个圆盘移动到需要步,然后再将个圆盘移动到需要步,再将最后一个圆盘移动到需要一步,再将个圆盘移动到需要步,所以